关于线程interrupt方法的问题,请前辈指点。
一看字面意思,我以为是用来中断线程的。后来看了书上的说明,我理解成它是用来中断sleep状态的。我做了试验,写了这样一段代码:
=====================================================================
public class ThreadTest implements Runnable
{
public void run()
{
System.out.println( "sleep...至Blocked状态 ");
while(true)
{
System.out.println( "running... ");
try
{
Thread.sleep(1000);
}
catch (InterruptedException ex)
{
ex.printStackTrace();
}
}
}
public static void main(String[] args)
{
Thread thread = new Thread(new ThreadTest());
thread.start();
thread.interrupt();
}
}
=====================================================================
运行结果如下:
=====================================================================
sleep...至Blocked状态
running...
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at ThreadTest.run(ThreadTest.java:14)
at java.lang.Thread.run(Thread.java:619)
running...
running...
running...
running...
running...
running...
=====================================================================
这时我只能这么理解:程序启动的时候有一个主线程,调用thread.start()的时候又开启了一个线程,接着执行这个线程的死循环里的第一次sleep(1000)方法,同时主线程执行了thread.interrupt()方法,使第一次的sleep中断。(我把interrupt理解成“唤醒”功能,呵呵,自己随便想的一个词。)
而我继续往下看书的时候(林信良的《Java JDK5.0学习笔记》),书上的一段话把我弄闷了:
=====================================================================
如果您想要停止一个线程的执行,当您查看API时,您会发现Thread的stop()方法已经被标示为deprecated,不建议使用stop()来停止一个线程的运行。
如果想要停止一个线程,最好自行实现。一个线程要进入Dead状态,就是执行完run()方法,简单地说,如果您想要停止一个线程的执行,就要提供一个方式让线程可以完成run()的流程,而这也是自行实现线程停止的基本概念。
................
如果线程因为执行sleep()而进入Blocked状态,而您想要停止它,可以使用interrupt(),而程序会抛出InterruptedException异常,因而使得线程离开run()方法。
=====================================================================
我的理解是,离开了run方法,不就是线程停止了吗?这和我刚刚的测试结果矛盾了呀。不明白了……
请前辈们指点迷津,并说说我理解上有哪些错误的地方,谢谢!
------解决方案--------------------抛出的InterruptedException异常被你catch掉了,你想从run中出来就在ex.printStackTrace();后加System.exit(1),或者throw new
RuntimeException()也可以
------解决方案--------------------wait,sleep等阻塞中的线程调用interrupt,会以抛出InterruptedException异常的形式结束阻塞,而并不会终止线程.需要注意的是,这种情况不会设置线程的中断状态
其他情况只是将线程中断状态置为true,即isInterrupted方法返回true
如果想控制线程的退出,应在线程运行中不断调用isInterrupted或interrupted检查线程中断状态