一看字面意思,我以为是用来中断线程的。后来看了书上的说明,我理解成它是用来中断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方法,不就是线程停止了吗?这和我刚刚的测试结果矛盾了呀。不明白了……请前辈们指点迷津,并说说我理解上有哪些错误的地方,谢谢!

解决方案 »

  1.   

    你都while(true)了,它怎么出的来呢???
      

  2.   

    书上说:如果线程因为执行sleep()而进入Blocked状态,而您想要停止它,可以使用interrupt(),而程序会抛出InterruptedException异常,因而使得线程离开run()方法。那个while循环是在run方法里面的,既然离开了run方法,应该就不会执行里面的程序了吧??
      

  3.   

    抛出的InterruptedException异常被你catch掉了,你想从run中出来就在ex.printStackTrace();后加System.exit(1),或者throw new RuntimeException()也可以
      

  4.   

    那书上说的这句话怎么解释?=====================================================================
    如果线程因为执行sleep()而进入Blocked状态,而您想要停止它,可以使用interrupt(),而程序会抛出InterruptedException异常,因而使得线程离开run()方法。
    =====================================================================
      

  5.   

    靠,人家也是个学习笔记啊,他说的意思应该是:你把while(true)去掉,然后sleep(100000000)这么长的时间,你去interrupt(),它就醒来了,不然就要猴年马月才能醒了
      

  6.   

    。。可那毕竟是林信良的书啊好吧,我想听听其它前辈怎么说,谢谢laolang08。   :)
      

  7.   

    我给个地址吧,学习笔记的免费试读。
    http://book.csdn.net/bookfiles/317/10031712979.shtml查找关键字“线程的停止”。就是从这开始,到“因为SomeThread中的run()方法有一个无穷循环。”为止,我不是很理解。
      

  8.   

    wait,sleep等阻塞中的线程调用interrupt,会以抛出InterruptedException异常的形式结束阻塞,而并不会终止线程.需要注意的是,这种情况不会设置线程的中断状态
    其他情况只是将线程中断状态置为true,即isInterrupted方法返回true如果想控制线程的退出,应在线程运行中不断调用isInterrupted或interrupted检查线程中断状态
      

  9.   

    这么说,我把interrupt方法理解成“唤醒”功能是对的咯?
      

  10.   

    就是一个人在食堂吃饭,可是吃的太慢了,你用interrupt()就是把他赶出食堂不让他吃了,他去食堂吃饭就是run方法。这样理解了吧!
      

  11.   

    是不是interrupt()方法一定是在sleep休眠期内才执行的?
      

  12.   

    楼上有人说的很有道理。如果一个线程调用了Object.wait()方法,或者Thread.sleep(),或者Thread.wait()方法,当调用interrup()方法的时候,就会将线程从阻塞状态中唤醒,抛出一个InterruptedException异常,如果catch到这个异常,就可以让程序退出来。如果线程一直在执行,没有上述的wait,sleep方法,那么就调用thread.isInterrupted()来判断线程是不是被中断过了。要注意的是,如果代码如下
    while(true){
         run(){.....}     
    }
     interrupted();
    那么程序永远不会停下来,将while条件改变一下:while(!isInterrupted()){
        run(){.....}
    }
    interrupted();
      

  13.   

    interrupt()方法用来“吵醒”休眠的线程。即: 它所完成的是当线程处于阻塞状态时,抛出InterruptedException异常,使其从阻塞状态退出来。interrupt()方法不会中断一个正在运行的线程。
    线程不会离开run()方法,只是从阻塞状态退出来。
      

  14.   

    抛出的InterruptedException异常被catch了,你想从run中出来就在ex.printStackTrace();后加System.exit(1),或者throw   new   RuntimeException()也可以 ,或写个 return; 这样就可以了。