黑马程序员技术交流社区
标题:
中断线程的问题
[打印本页]
作者:
↙五线谱╲
时间:
2013-12-4 13:55
标题:
中断线程的问题
package manyThreadRun;
/*
* Stop方法已经过时。
*
* 如何停止线程?
* 只有一种,run方法结束。
* 开启多线程运行,运行代码通常是循环结构
*
* 只要控制住循环,就可以让run方法结束,也就是线程结束。
*
* 特殊情况:
* 当线程处于冻结状态,
* 就不会读取到标记,那么线程就不会结束。
*
* 当没有指定的方式让冻结的线程恢复到运行状态时,这是需要对冻结进行清除。
* 强制让线程恢复到运行状态中来。这样就就可以操作标记让线程结束。
*
* Thread类提供该方法 interrupt();
*/
class StopThread implements Runnable {
private boolean flag = true;
public synchronized void run() {
while (flag) {
try {
wait();
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName()
+ "....Exception");
flag = false;
}
System.out.println(Thread.currentThread().getName() + "....run");
}
}
public void changeFlag() {
flag = false;
}
}
public class StopThreadDemo {
/**
* @param args
*/
public static void main(String[] args) {
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
int num = 0;
while (true) {
if (num++ == 60) {
// st.changeFlag();
t1.interrupt();
t2.interrupt();
break;
}
System.out.println(Thread.currentThread().getName() + "...." + num);
}
System.out.println("over");
}
}
结果有三种:
1:over
Thread-0....Exception
Thread-0....run
Thread-1....Exception
Thread-1....run
2:over
Thread-0....Exception
Thread-0....run
3:over
Thread-1....Exception
Thread-1....run
为什么结果是三种情况呢?有点糊涂
作者:
.Mr
时间:
2013-12-4 14:59
线程应该运行全部结束了。
主函数一运行,2个线程都会处于冻结状态 因为wait
当到interrtupt时全强制恢复到运行状态,执行下面程序,改变了标记线程停止
我运行了一下 结果如下
class StopThread implements Runnable
{
private boolean flag = true;
public synchronized void run()
{
while(flag)
{
try
{
wait();//t0 t1
}
catch (InterruptedException e)
{
System.out.println(Thread.currentThread().getName()+"....."+"exception");
flag = false;
}
System.out.println(Thread.currentThread().getName()+"......run");
}
}
public void setFlag()
{
flag = false;
}
}
class StopThreadDemo
{
public static void main(String[] args)
{
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
int num = 0;
while(true)
{
if(++num==50)
{
// st.setFlag();
t1.interrupt();
t2.interrupt();
break;
}
System.out.println("main...."+num);
}
System.out.println("over");
}
}
H:\QQ图片20131204145635.jpg
作者:
.Mr
时间:
2013-12-4 15:01
.Mr 发表于 2013-12-4 14:59
线程应该运行全部结束了。
主函数一运行,2个线程都会处于冻结状态 因为wait
当到interrtupt时全强制恢复到 ...
H:\QQ图片20131204145635.jpg
作者:
王家胜
时间:
2013-12-4 18:23
本帖最后由 王家胜 于 2013-12-4 18:24 编辑
我amd的cpu只能执行出两个线程都存在的结果,试了好多次了。
api上说
如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。
t1,t2两个线程都在那里等待
t1.interrupt();第一个线程抛出异常,第一个线程就干掉了
作者:
简★零度
时间:
2013-12-5 22:57
下次问题解决了就把类型改成提问结束!谢谢!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2