一看字面意思,我以为是用来中断线程的。后来看了书上的说明,我理解成它是用来中断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方法,不就是线程停止了吗?这和我刚刚的测试结果矛盾了呀。不明白了……请前辈们指点迷津,并说说我理解上有哪些错误的地方,谢谢!
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方法,不就是线程停止了吗?这和我刚刚的测试结果矛盾了呀。不明白了……请前辈们指点迷津,并说说我理解上有哪些错误的地方,谢谢!
解决方案 »
- 来个题目,提提神
- 调用!
- 多线程问题,进来看看
- 问一个Producer-Consumer模型问题
- 有包与无包
- 我自己写的一个JTableComboBox,弹出面板里的table不能响应鼠标事件,请高手赐教!!
- 在java中像ActionListener这样的接口类(在java帮助文档里面有的)有哪些,举些常用的,说明用途,谢谢!!
- 急急,各位高手救救我!!!
- 用eclipse请进
- 请帮我看看这段程序,他老说我没返回值?因该怎么改?
- out-of-the-box 在Java中是什么意思
- Error Message: ids for this class must be manually assigned before calling save():
如果线程因为执行sleep()而进入Blocked状态,而您想要停止它,可以使用interrupt(),而程序会抛出InterruptedException异常,因而使得线程离开run()方法。
=====================================================================
http://book.csdn.net/bookfiles/317/10031712979.shtml查找关键字“线程的停止”。就是从这开始,到“因为SomeThread中的run()方法有一个无穷循环。”为止,我不是很理解。
其他情况只是将线程中断状态置为true,即isInterrupted方法返回true如果想控制线程的退出,应在线程运行中不断调用isInterrupted或interrupted检查线程中断状态
while(true){
run(){.....}
}
interrupted();
那么程序永远不会停下来,将while条件改变一下:while(!isInterrupted()){
run(){.....}
}
interrupted();
线程不会离开run()方法,只是从阻塞状态退出来。