java interrupt()方法
来源:互联网 发布:天津加工中心编程招聘 编辑:程序博客网 时间:2024/06/05 05:39
Thread.interrupt并不会中断一个正在运行的线程
package thread;class Test extends Thread { boolean stop=false; public static void main( String args[] ) throws Exception { Test thread = new Test(); System.out.println( "Starting thread..." ); thread.start(); Thread.sleep( 3000 ); System.out.println( "Interrupting thread..." ); thread.interrupt(); Thread.sleep( 3000 ); System.out.println("Stopping application..." ); //System.exit(0); } public void run() { while(!stop){ System.out.println( "Thread is running..." ); long time = System.currentTimeMillis(); while((System.currentTimeMillis()-time < 1000)) { } } System.out.println("Thread exiting under request..." ); }}控制台运行结果如下:
Starting thread...
Thread is running...
Thread is running...
Thread is running...
Thread is running...
Interrupting thread...
Thread is running...
Thread is running...
....
在Thread.interrupt()被调用后,线程仍然继续运行。
使用Thread.interrupt()中断线程
Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。
因此,如果线程被上述几种方法阻塞,正确的停止线程方式是设置共享变量,并调用interrupt()(注意变量应该先设置)。如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。在任何一种情况中,最后线程都将检查共享变量然后再停止。
package thread;class Test extends Thread { volatile boolean stop = false; public static void main( String args[] ) throws Exception { Test thread = new Test(); System.out.println( "Starting thread..." ); thread.start(); Thread.sleep( 3000 ); System.out.println( "Asking thread to stop..." ); thread.stop = true;//如果线程阻塞,将不会检查此变量 thread.interrupt(); Thread.sleep( 3000 ); System.out.println( "Stopping application..." ); //System.exit( 0 ); } public void run() { while ( !stop ) { System.out.println( "Thread running..." ); try { Thread.sleep( 1000 ); } catch ( InterruptedException e ) { System.out.println( "Thread interrupted..." ); } } System.out.println( "Thread exiting under request..." ); }}
Thread.interrupt()被调用,线程便收到一个异常,于是逃离了阻塞状态并确定应该停止,运行结果:Starting thread...
Thread running...
Thread running...
Thread running...
Asking thread to stop...
Thread interrupted...
Thread exiting under request...
Stopping application...
总结:
Thread.interrupt()并不会中断一个正在运行的线程。但是,如果线程被阻塞,就会抛出一个中断信号,这样线程就得以退出阻塞的状态,使阻塞状态的线程逃离阻塞状态
void interrupt():向线程发送中断。线程中断状态被设置为true.如果目前线程被一个sleep调用阻塞,那么抛出InterruptedException异常
static boolean interrupted():测试当前线程是否被中断。这是静态方法,调用会产生副作业,它将当前线程的中断状态重置为false
boolean isInterrupted():测试当前线程是否被中断,不改变中断状态
参考网址:
http://blog.csdn.net/wxwzy738/article/details/8516253
- Java Thread.interrupt方法
- java interrupt()方法
- java Thread interrupt方法
- Java并发编程-interrupt()方法
- java线程--关于interrupt()方法
- java线程中的interrupt,isInterrupt,interrupted方法
- java线程中的interrupt,isInterrupt,interrupted方法
- 停止Java线程,小心interrupt()方法
- Java中用interrupt()方法中断阻塞线程
- java多线程状态及interrupt()方法
- java线程之sleep、interrupt方法
- Java中的线程Thread方法之---interrupt()
- Java中的线程Thread方法之---interrupt()
- java线程中的interrupt,isInterrupt,interrupted方法
- 停止Java线程,小心interrupt()方法
- java线程中的interrupt,isInterrupt,interrupted方法
- java线程中的interrupt,isInterrupt,interrupted方法
- 停止Java线程,小心interrupt()方法
- java下载压缩包简化代码
- 【ARM-LInux开发】如何运行wayland
- UILabel显示固定行数的问题
- Mysql+mybatis 反转生成实体类和Mapper文件以及Mapper.xml文件
- java 中整型与字符型的相互转换
- java interrupt()方法
- linux search.
- linux基础命令
- week3_day1_SQL SERVER
- 文章标题
- Storm集成Kafka应用的开发
- zstu 4240 极差 zstu oj 4238 Save the Princess
- 深度学习应用大盘点
- 为什么要用automatic provisioning