`
learen
  • 浏览: 11165 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

黑马程序员 sleep(),join(),interrupt(),wait(),notify() 区别与联系

 
阅读更多

    ------- android培训java培训、期待与您交流! ----------

1. sleep() & interrupt()
    线程A正在使用sleep()暂停着: Thread.sleep(100000);
    如果要取消他的等待状态,可以在正在执行的线程里(比如这里是B)调用
        a.interrupt();
    令线程A放弃睡眠操作,这里a是线程A对应到的Thread实例
    执行interrupt()时,并不需要获取Thread实例的锁定.任何线程在任何时刻,都可以调用其他线程interrupt().当sleep中的线程被调用interrupt()时,就会放弃暂停的状态.并抛出InterruptedException.丢出异常的,是A线程.

2. wait() & interrupt()
    线程A调用了wait()进入了等待状态,也可以用interrupt()取消.
    不过这时候要小心锁定的问题.线程在进入等待区,会把锁定解除,当对等待中的线程调用interrupt()时(注意是等待的线程调用其自己的interrupt()),会先重新获取锁定,再抛出异常.在获取锁定之前,是无法抛出异常的.

3. join() & interrupt()
    当线程以join()等待其他线程结束时,一样可以使用interrupt()取消之.因为调用join()不需要获取锁定,故与sleep()时一样,会马上跳到catch块里. 注意是随调用interrupt()方法,一定是阻塞的线程来调用其自己的interrupt方法.如在线程a中调用来线程t.join().则a会等t执行完后在执行t.join后的代码,当在线程b中调用来a.interrupt()方法,则会抛出InterruptedException

4. interrupt()只是改变中断状态而已
    interrupt()不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。
    如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。
    线程A在执行sleep,wait,join时,线程B调用A的interrupt方法,的确这一个时候A会有InterruptedException异常抛出来.但这其实是在sleep,wait,join这些方法内部会不断检查中断状态的值,而自己抛出的InterruptedException。
    如果线程A正在执行一些指定的操作时如赋值,for,while,if,调用方法等,都不会去检查中断状态,所以线程A不会抛出InterruptedException,而会一直执行着自己的操作.当线程A终于执行到wait(),sleep(),join()时,才马上会抛出InterruptedException.
    若没有调用sleep(),wait(),join()这些方法,或是没有在线程里自己检查中断状态自己抛出InterruptedException的话,那InterruptedException是不会被抛出来的.

顺便加个与Thread.sleep()相同效果的代码:
public static void amethod(long x) throws InterruptedExcetion{
    if (x != 0) {
        Object o = new Object();
        synchronized (o) {
            o.wait(x);
        }
    }
}

分享到:
评论

相关推荐

    黑马程序员入学Java知识

    ### 黑马程序员入学Java知识 #### Java概述与基础知识 1. **何为编程?** - 编程是通过特定的计算机语言来编写指令,让计算机执行一系列任务的过程。 2. **Java语言概述,历史、特点** - **概述**:Java是一种...

    wait()编程wait()编程wait()编程wait()编程

    - `wait()`是可中断的,当线程被中断(`Thread.interrupt()`)时,`wait()`会抛出`InterruptedException`,这时线程需要处理中断状态,决定是否继续等待或结束。 - 使用`wait()`时,应避免无限期等待,通常建议...

    Android开发问题集锦第三期

    如果线程正处于等待状态(例如通过调用`wait()`、`join()`或`sleep()`等方法),那么调用`interrupt`会导致该线程抛出`InterruptedException`异常。因此,在使用这些可能导致线程等待的方法时,通常需要处理`...

    Java的多线程-线程间的通信.doc

    Java提供了多种机制来实现线程间的通信,包括使用wait(), notify()和notifyAll()方法,以及使用synchronized关键字控制并发访问共享资源。这些方法都定义在java.lang.Thread类中。 1. **wait(), notify()和...

    JUC学习.docx Java

    线程中常见的方法有`sleep`、`interrupt`、`isInterrupted`、`interrupted`、`park`、`yield`、`join`、`wait`和`notify`。`sleep`可以让线程进入等待状态,但不会释放锁。`interrupt`用于中断线程,尤其能打断`...

    多线程面试专题-答案.pdf

    当线程因为调用wait()、sleep()或join()方法而阻塞时,可以通过调用线程的interrupt方法来中断线程,该方法会抛出InterruptedException,从而使线程醒来。需要注意的是,由于IO阻塞导致的线程阻塞不能通过这种方式...

    JavaPD-Ch08mao线程1

    线程常用的方法包括start()启动线程,run()执行线程的主体代码,sleep()使线程暂停指定时间,join()等待线程结束,isAlive()检查线程是否存活,interrupt()中断线程,interrupted()检查线程是否已被中断等。...

    Java工程师线程试题

    线程的生命周期由`start()`、`run()`、`sleep()`、`join()`、`interrupt()`等方法共同控制。 理解并熟练掌握这些Java线程知识对于Java工程师来说至关重要,因为线程控制是多任务并行处理和系统优化的关键。在实际...

    Java多线程详解与多线程实例

    当线程在阻塞状态下(如调用`sleep()`, `join()`, 或者`wait()`),检测到中断标志后,会抛出`InterruptedException`,允许线程优雅地结束。例如: ```java thread.interrupt(); try { thread.join(); } catch ...

    Java多线程之基础篇(二).docx

    2. 实例分析:这些方法通常与synchronized关键字配合使用,确保在调用wait()和notify()时,只有一个线程持有对象锁。 三、线程让步和休眠 线程让步和休眠是控制线程执行顺序和时间的手段。 1. 线程让步:Yield()...

    Java中线程的基本方法使用技巧

    例如,使用wait/notify进行线程间的通信,使用sleep实现定时任务,通过interrupt实现线程的可控终止,而join则可以帮助我们控制线程执行的顺序。 在实际开发中,除了这些基础方法,还要考虑线程安全、死锁、活锁等...

    并发题库 (含参考答案).md

    `Thread.sleep()`与`Object.wait()`的区别 - **相似之处**:两者都能使当前线程暂停执行一段时间。 - **不同之处**: - `wait()`是`Object`类的方法,需要在同步上下文中使用,可以释放当前持有的锁;`sleep()`是`...

    JAVA多线程操作方法实用大全

    `wait()`、`notify()`和`notifyAll()`方法是与对象监视器相关的,它们通常与`synchronized`关键字配合使用。在同步块中,`wait()`使当前线程进入对象的等待池,等待其他线程唤醒。`notify()`唤醒等待池中的一个线程...

    Java多线程初学者指南:线程的生命周期.pdf

    而`wait()`和`notify()`方法通常与`synchronized`关键字一起使用,用于实现线程间的通信和协作,使得线程在满足特定条件时才能继续执行。 总的来说,理解和掌握线程生命周期以及状态转换是编写高效、安全的多线程...

    java编程 ---线程

    线程的基本控制包括:`sleep()`让线程暂停一段时间,`join()`使当前线程等待另一个线程结束,`yield()`让当前线程让出CPU使用权,以及`interrupt()`中断线程。 **4. 使用`synchronized`关键字** `synchronized`用于...

    1z0-851.260qJAVA考试题库

    InterruptedException是线程中断时抛出的异常,当线程在调用sleep、wait、join方法时被其他线程中断会抛出此异常。题库中的代码示例可能不会抛出此异常,除非调用了Thread的interrupt方法。 2. ...

    java多线程试题[汇编].pdf

    3. `sleep()` 和 `wait()` 的主要区别在于,`sleep()` 不需要其他线程唤醒,而 `wait()` 需要其他线程调用 `notify()` 或 `notifyAll()` 方法唤醒。 4. 启动线程应该使用 `start()` 方法,而不是 `run()`,因为 `...

    多线程使用操作大全

    - **方法**: `sleep()`、`join()`、`yield()`、`wait()`、`notify()` / `notifyAll()` - **功能**: - `sleep()`: 使当前线程暂停指定的时间。 - `join()`: 当前线程等待另一个线程结束。 - `yield()`: 让出CPU给...

    Java多线程问题

    wait与sleep方法的区别 - **原理不同**:`sleep()`是Thread类的静态方法,用于让线程暂停指定的时间;`wait()`是Object类的方法,用于线程间的通信,使持有锁的线程进入等待状态。 - **锁的处理**:`sleep()`不会...

Global site tag (gtag.js) - Google Analytics