日期:2014-05-20  浏览次数:20779 次

关于线程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检查线程中断状态