<meta content="text/html; charset=utf-8" http-equiv="CONTENT-TYPE">
<meta content="OpenOffice.org 3.2 (Linux)" name="GENERATOR">
<style type="text/css">
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
-->线程正在使用暂停着如果要取消他的等待状态可以在正在执行的线程里比如这里是调用
令线程放弃睡眠操作这里是线程对应到的实例
执行时并不需要获取实例的锁定任何线程在任何时刻都可以调用其他线程当中的
线程被调用时就会放弃暂停的状态并抛出丢出异常的是线程线程调用了进入了等待状态也可以用取消不过这时候要小心锁定的问题线程在进入等待区会把锁定解除当对当线程以等待其他线程结束时一样可以使用取消之因为调用不需要获取锁定故与时一样会马上跳到块里只是改变中断状态而已 不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切
的说,如果线程被和三种方法之一阻塞,那么,它将接收到一个中断异常(),从而
提早地终结被阻塞状态。 如果线程没有被阻塞,这时调用将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。
线程在执行时线程调用的方法的确这一个时候会有异常抛出来但这其实是在这些方法内部会不断检查中断状态的值而自己抛出的。
如果线程正在执行一些指定的操作时如赋值调用方法等都不会去检查中断状态所以线程不会抛出
而会一直执行着自己的操作当线程终于执行到时才马上会抛出
若没有调用这些方法或是没有在线程里自己检查中断状态自己抛出的
话那是不会被抛出来的
</style>
<meta content="text/html; charset=utf-8" http-equiv="CONTENT-TYPE">
<meta content="OpenOffice.org 3.2 (Linux)" name="GENERATOR">
<style type="text/css">
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
--</style>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是不会被抛出来的.
分享到:
相关推荐
一个线程join另一个线程,(包括和interrupt互动的用法)3---马克-to-win java视频
一个线程join另一个线程,(包括和interrupt互动的用法)1---马克-to-win java视频
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
java线程中的interrupt,isInterrupt,interrupted方法
线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法(礼让)、join方法(合并)、interrupt()方法(中断),线程的生命周期 线程 与 进程 的关系:**有一个进程中至少包含一个线程 **...
线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以...
方法结束线程使用interrupt()方法来中断线程有两种情况: 1. 线程处于阻塞状态:如使用了sleep,同步锁的wait,socket中的receiver,accept等方法时,会使线程处于阻塞状态。当调用线程的interrupt()方法时,会抛出...
Thread.interrupt()方法的使用以及使用它退出线程
一个线程join另一个线程,(包括和interrupt互动的用法)2---马克-to-win java视频
java线程中断之interrupt和stop.docx
interrupt()和线程终止方式[整理].pdf
本人利用Thread.Abort()与Thread.Interrupt()可以引起目标线程异常的特点,开发了一种不使用已过时的方法来变相从外部控制线程的挂起与恢复的技术,原理简单,方便理解。 相关技术参考:...
Interrupt 和 Abort 线程状态 等待句柄 同步环境 使用多线程 单元模式和Windows Forms BackgroundWorker类 ReaderWriterLock类 线程池 异步委托 计时器 局部储存 高级话题 非阻止同步 Wait和Pulse Suspend和Resume ...
interrupt(),在一个线程中调用另一个线程的interrupt()方法,即会向那个线程发出信号——线程中断状态已被设置。至于那个线程何去何从,由具体的代码实现决定。 isInterrupted(),用来判断当前线程的中断状态...
主要介绍了JAVA 多线程--interrupt()和线程终止方式的的相关资料,文中代码非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
线程“张工”和线程“王工”分别负责“搬运苹果”(3箱)和“搬运香蕉”(3箱),他们每搬运一箱,就准备休息10秒钟(sleep方法),但是线程“老板”负责不让他们休息(interrupt方法)。 2. 编写一个包含主方法main...
主要介绍了Java如何使用interrupt()终止线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
interrupt 方法:中断线程的执行。 synchronized 关键字:用于实现线程的同步,确保多个线程之间的安全访问共享资源。 Lock 接口和 ReentrantLock 类:提供更灵活的线程同步机制。 Executor 框架和线程池:用于管理...
interrupt字面上是中断的意思,但在Java里Thread.interrupt()方法实际上通过某种方式通知线程,并不会直接中止该线程
停止(stop)一个线程(靠interrupt手段)4---马克-to-win java视频