`
fatzhan
  • 浏览: 8281 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

sleep, wait, join和interrupt

    博客分类:
  • Java
阅读更多
对joint和interrupt理解的不够好,在中文的JDK参考手册上,说join是“等待该线程结束”,这里是不是该说成“等待正在执行的线程的结束”?。。因为在一些书上和论坛上看了都是说Join是在等待其他线程结束。。

以下是参考<<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()时,会先重新获取锁定,再抛出异常.在获取锁定之前,是无法抛出异常的.

3. join() & interrupt()
    当线程以join()等待其他线程结束时,一样可以使用interrupt()取消之.因为调用join()不需要获取锁定,故与sleep()时一样,会马上跳到catch块里.

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是不会被抛出来的.
分享到:
评论

相关推荐

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

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

    java线程中断之interrupt和stop.docx

    如果线程正在执行等待操作(如`sleep`、`wait`或`join`),则会抛出`InterruptedException`异常,从而打断这种阻塞状态。 ##### 2.2 方法签名 ```java public void interrupt(); ``` ##### 2.3 使用示例 下面是一...

    Thread类的interrupt(),interrupted(),isInterrupted()1

    如果线程正在阻塞(例如在调用`Thread.sleep()`, `Thread.join()`, 或者`Object.wait()`),这些方法在检测到中断状态时会抛出`InterruptedException`,并清除中断状态。这意味着线程必须自行处理`...

    JUC学习.docx Java

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

    深入分析JAVA 多线程--interrupt()和线程终止方式

    如果本线程是处于阻塞状态:调用线程的 wait() , wait(long) 或 wait(long, int) 会让它进入等待(阻塞)状态,或者调用线程的 join(),join(long),join(long, int),sleep(long),sleep(long, int) 也会让它进入...

    Java如何使用interrupt()终止线程

    当线程由于被调用了sleep(), wait(), join()等方法而进入阻塞状态;若此时调用线程的interrupt()将线程的中断标记设为true。由于处于阻塞状态,中断标记会被清除,同时产生一个InterruptedException异常。将...

    java中终止一个线程的方法总结(精)

    `Thread.interrupt()`方法会设置线程的中断状态,并在当前线程调用`wait()`, `join()`, 或 `sleep()`时抛出`InterruptedException`。但在线程执行普通逻辑时,如循环或赋值操作,`interrupt()`并不会影响线程的执行...

    2022年操作系统nachos课程设计实验报告.doc

    本资源是关于操作系统课程设计实验报告,涵盖了 Nachos 操作系统的实现细节,包括 Join 方法、Condition 变量、Alarm 类、Communicator 类、PriorityScheduler 类和 Boat 类的实现。 一、Join 方法 Join 方法是 ...

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

    在上述示例中,`TestIsAlive`展示了如何使用`isAlive()`方法检查线程是否运行,而`TestInterrupt`演示了`sleep()`和`interrupt()`的用法。当`Thread.sleep()`被`interrupt()`打断时,`InterruptedException`会被抛出...

    Java多线程之中断线程(Interrupt)的使用详解

    例如,如果线程在等待对象的`wait()`方法,调用`sleep()`,或者在`join()`其他线程,那么这些方法在检测到中断状态时会抛出`InterruptedException`。这使得线程有机会捕获异常并采取适当的行动,通常这意味着结束...

    Java工程师线程试题

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

    山东大学操作系统nachos实验报告

    3. **禁止中断操作:** 在`join()`函数开始和结束时禁用中断,以防止在此期间发生不可预知的行为。 ```java boolean intStatus = Machine.interrupt().disable(); // ...其他操作... Machine.interrupt()....

    Java线程如何终止.pdf

    - 当线程正在执行`sleep`、`wait`或者`join`等阻塞方法时,调用`interrupt`会抛出`InterruptedException`,从而使线程有机会捕获异常并退出。 - 另一种情况是,在循环中检查`isInterrupted`状态,当检测到中断时,...

    线程终止问题

    - **线程处于阻塞状态**:如线程调用了 `sleep()` 或 `wait()` 方法。当调用 `interrupt()` 时,这些阻塞方法会抛出 `InterruptedException`,线程可以捕获这个异常并优雅地终止。 - **使用 `isInterrupted()` 检查...

    java7源码-thread:多线程相关的学习

    Waiting:具有指定等待时间的等待线程的线程状态(sleep、wait、join、parkNanos、parkUntil) 6.Terminated:终止线程的线程状态。线程正常执行完成或出现异常 ​ 代码:Demo01 线程切换状态图 线程终止 不正确的线程...

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

    Lock接口提供了lock(), unlock(), newCondition()等方法,Condition接口则提供了await(), signal()和signalAll()方法,类似于wait(), notify()和notifyAll()。 在实际开发中,正确使用这些线程通信机制可以避免数据...

    DoSleep

    `wait()`和`join()`需要在同步块或同步方法中调用,它们涉及到对象锁的释放和重新获取,而`sleep()`则不会释放任何锁。 6. **线程调度** `Thread.sleep()`可以用来调整线程调度策略,例如,让某些低优先级的线程在...

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

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

    java编程高级_多线程编程

    而线程中断则是用来处理线程间的一种协作机制,通过调用线程对象的interrupt()方法来发送中断信号,被中断的线程在执行到下一个wait()、sleep()或join()调用时会抛出InterruptedException异常,或者可以调用Thread类...

    Android开发问题集锦第三期

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

Global site tag (gtag.js) - Google Analytics