关于线程interrupt方法的问题,请前辈指点。

codeartisan 2007-07-19 11:29:49
一看字面意思,我以为是用来中断线程的。后来看了书上的说明,我理解成它是用来中断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方法,不就是线程停止了吗?这和我刚刚的测试结果矛盾了呀。不明白了……

请前辈们指点迷津,并说说我理解上有哪些错误的地方,谢谢!
...全文
1656 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
笑料 2012-11-01
  • 打赏
  • 举报
回复
抛出的InterruptedException异常被catch了,你想从run中出来就在ex.printStackTrace();后加System.exit(1),或者throw new RuntimeException()也可以 ,或写个 return; 这样就可以了。
shenxufei 2012-07-25
  • 打赏
  • 举报
回复
interrupt()方法用来“吵醒”休眠的线程。即: 它所完成的是当线程处于阻塞状态时,抛出InterruptedException异常,使其从阻塞状态退出来。interrupt()方法不会中断一个正在运行的线程。
线程不会离开run()方法,只是从阻塞状态退出来。
jackaudrey001 2012-05-27
  • 打赏
  • 举报
回复
楼上有人说的很有道理。如果一个线程调用了Object.wait()方法,或者Thread.sleep(),或者Thread.wait()方法,当调用interrup()方法的时候,就会将线程从阻塞状态中唤醒,抛出一个InterruptedException异常,如果catch到这个异常,就可以让程序退出来。如果线程一直在执行,没有上述的wait,sleep方法,那么就调用thread.isInterrupted()来判断线程是不是被中断过了。要注意的是,如果代码如下
while(true){
run(){.....}
}
interrupted();
那么程序永远不会停下来,将while条件改变一下:while(!isInterrupted()){
run(){.....}
}
interrupted();

dreamjue 2012-04-05
  • 打赏
  • 举报
回复
是不是interrupt()方法一定是在sleep休眠期内才执行的?
rmm0001 2011-08-17
  • 打赏
  • 举报
回复
就是一个人在食堂吃饭,可是吃的太慢了,你用interrupt()就是把他赶出食堂不让他吃了,他去食堂吃饭就是run方法。这样理解了吧!
codeartisan 2007-07-20
  • 打赏
  • 举报
回复
我给个地址吧,学习笔记的免费试读。
http://book.csdn.net/bookfiles/317/10031712979.shtml

查找关键字“线程的停止”。就是从这开始,到“因为SomeThread中的run()方法有一个无穷循环。”为止,我不是很理解。
codeartisan 2007-07-20
  • 打赏
  • 举报
回复
。。可那毕竟是林信良的书啊

好吧,我想听听其它前辈怎么说,谢谢laolang08。 :)
laolang08 2007-07-20
  • 打赏
  • 举报
回复
靠,人家也是个学习笔记啊,他说的意思应该是:你把while(true)去掉,然后sleep(100000000)这么长的时间,你去interrupt(),它就醒来了,不然就要猴年马月才能醒了
codeartisan 2007-07-20
  • 打赏
  • 举报
回复
那书上说的这句话怎么解释?

=====================================================================
如果线程因为执行sleep()而进入Blocked状态,而您想要停止它,可以使用interrupt(),而程序会抛出InterruptedException异常,因而使得线程离开run()方法。
=====================================================================
laolang08 2007-07-20
  • 打赏
  • 举报
回复
抛出的InterruptedException异常被你catch掉了,你想从run中出来就在ex.printStackTrace();后加System.exit(1),或者throw new RuntimeException()也可以
codeartisan 2007-07-20
  • 打赏
  • 举报
回复
up
codeartisan 2007-07-20
  • 打赏
  • 举报
回复
这么说,我把interrupt方法理解成“唤醒”功能是对的咯?
CrazyGou 2007-07-20
  • 打赏
  • 举报
回复
wait,sleep等阻塞中的线程调用interrupt,会以抛出InterruptedException异常的形式结束阻塞,而并不会终止线程.需要注意的是,这种情况不会设置线程的中断状态
其他情况只是将线程中断状态置为true,即isInterrupted方法返回true

如果想控制线程的退出,应在线程运行中不断调用isInterrupted或interrupted检查线程中断状态
codeartisan 2007-07-19
  • 打赏
  • 举报
回复
书上说:如果线程因为执行sleep()而进入Blocked状态,而您想要停止它,可以使用interrupt(),而程序会抛出InterruptedException异常,因而使得线程离开run()方法。

那个while循环是在run方法里面的,既然离开了run方法,应该就不会执行里面的程序了吧??
laolang08 2007-07-19
  • 打赏
  • 举报
回复
你都while(true)了,它怎么出的来呢???

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧