java多线程学习笔记(2)——中断线程
2015-07-24 22:11
357 查看
当对一个线程调用线程终止方法时,线程的中断状态将被置位。这是每一个线程都具有的boolean标志。每个线程都应该时不时地检查这个标志,以判断线程是否被中断。
要想弄清中断状态是否被置位,首先调用静态的Thread.currentThread方法获得当前线程,然后调用isInterrupted method方法:
while(!Thread.currentThread().isInterrupted() ){
do more work
}
但是,如果线程被阻塞,就无法检测中断状态。这是产生InterruptedException异常的地方。当在一个被阻塞的线程(调用sleep或wait)上调用interrupt方法时,阻塞调用将会被Interrupted Exception异常中断。
一个线程被中断不意味着它一定要被终止。中断一个线程不过是引起他的注意。被中断的线程可以决定如何响应中断。某些线程是如此重要以至于应该处理完异常后,继续执行,而不理会中断。但是,更普遍的情况是,线程将简单地中断作为一个终止得请求。
interrupt方法 和 isInterrupted。isInterrupted方法是一个静态方法,它检测当前的线程是否被中断。而且,调用interrupted方法会清除该线程的中断状态。另一方面,isInterrupted方法是一个实例方法,可用来检测是否有线程被中断。调用这个方法不会改变中断状态。
interrupt api
中断线程。
如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的 checkAccess 方法就会被调用,这可能抛出 SecurityException。
如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。
如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException。
如果该线程在一个 Selector 中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的 wakeup 方法一样。
如果以前的条件都没有保存,则该线程的中断状态将被设置。
中断一个不处于活动状态的线程不需要任何作用。
抛出:
SecurityException - 如果当前线程无法修改该线程
interrupted
测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。
线程中断被忽略,因为在中断时不处于活动状态的线程将由此返回 false 的方法反映出来。
返回:
如果当前线程已经中断,则返回 true;否则返回 false。
另请参见:
isInterrupted()
isInterrupted
测试线程是否已经中断。线程的中断状态 不受该方法的影响。
线程中断被忽略,因为在中断时不处于活动状态的线程将由此返回 false 的方法反映出来。
返回:
如果该线程已经中断,则返回 true;否则返回 false。
另请参见:
interrupted()
参考:
http://polaris.blog.51cto.com/1146394/372146/
要想弄清中断状态是否被置位,首先调用静态的Thread.currentThread方法获得当前线程,然后调用isInterrupted method方法:
while(!Thread.currentThread().isInterrupted() ){
do more work
}
但是,如果线程被阻塞,就无法检测中断状态。这是产生InterruptedException异常的地方。当在一个被阻塞的线程(调用sleep或wait)上调用interrupt方法时,阻塞调用将会被Interrupted Exception异常中断。
一个线程被中断不意味着它一定要被终止。中断一个线程不过是引起他的注意。被中断的线程可以决定如何响应中断。某些线程是如此重要以至于应该处理完异常后,继续执行,而不理会中断。但是,更普遍的情况是,线程将简单地中断作为一个终止得请求。
interrupt方法 和 isInterrupted。isInterrupted方法是一个静态方法,它检测当前的线程是否被中断。而且,调用interrupted方法会清除该线程的中断状态。另一方面,isInterrupted方法是一个实例方法,可用来检测是否有线程被中断。调用这个方法不会改变中断状态。
interrupt api
public void interrupt()
中断线程。
如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的 checkAccess 方法就会被调用,这可能抛出 SecurityException。
如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。
如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException。
如果该线程在一个 Selector 中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的 wakeup 方法一样。
如果以前的条件都没有保存,则该线程的中断状态将被设置。
中断一个不处于活动状态的线程不需要任何作用。
抛出:
SecurityException - 如果当前线程无法修改该线程
interrupted
public static boolean interrupted()
测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。
线程中断被忽略,因为在中断时不处于活动状态的线程将由此返回 false 的方法反映出来。
返回:
如果当前线程已经中断,则返回 true;否则返回 false。
另请参见:
isInterrupted()
isInterrupted
public boolean isInterrupted()
测试线程是否已经中断。线程的中断状态 不受该方法的影响。
线程中断被忽略,因为在中断时不处于活动状态的线程将由此返回 false 的方法反映出来。
返回:
如果该线程已经中断,则返回 true;否则返回 false。
另请参见:
interrupted()
参考:
http://polaris.blog.51cto.com/1146394/372146/
相关文章推荐
- Java与C#的语法区别(不断更新中...)
- 定义构造方法的程序.java
- Java错误提示--------Only a type can be imported. java.awt.event resolves to a package
- Java利用POI导入导出Excel中的数据
- JAVA应用程序打包成windows下的可执行程序的方法
- 疯狂java讲义中的习题,设计一个简单的计算器。
- org.springframework.web.util.NestedServletException:
- Java 注解
- Spring(九)让Spring自动扫描和管理Bean
- Java Type VS Hibernate Type
- hadoop开发:eclipse运行wordcount实例
- How to Compile Java DBus
- java 命令行参数输入法的应用
- JAVA中的String连接性能
- Java设计模式之单例模式
- 设计模式第一讲:单例模式(IBM开发者论坛已经发表的文章)
- Java学习篇------Java文本框
- netBeans调试时不进入java内部类(jdk源码)的方法
- java.util.Random.nextInt(int n)方法实例
- MyEclipse常见错误汇总,中英注释版(长期更新)