黑马程序员技术交流社区
标题:
多线程中,中断线程的问题
[打印本页]
作者:
∏艾力克斯※
时间:
2013-11-21 12:02
标题:
多线程中,中断线程的问题
本帖最后由 ∏艾力克斯※ 于 2013-11-22 21:46 编辑
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
为什么结果是三种情况呢?有点糊涂
作者:
汪洋大海
时间:
2013-11-21 16:15
因为你在run方法上加了一个synchronized。
第一种下情况,就是t1先执行wait了,t2再执行,wait了。main再执行,一口气执行完。t1和t2都进入catch。
其它两种情况,就是当t1,或t2拿到执行权后wait了。然后执行权被main拿到了。它一口气就执行完了。
这时,被wait的线程进入了catch,改变了flag,执行完。最后一个线程判断flag为flase变结束了。
为什么我还是3分?
作者:
smileven
时间:
2013-11-21 17:27
其实不止这三种情况,先给你解释一下这三种情况的原因:
因为主线程开启t1和t2两个线程的时候是按照先t1,后t2的顺序开启的;
但是哪一个线程先运行取决于CPU的快速切换,也就是线程运行的随机性,所以t1和t2哪一个先执行是不确定的。
t1和t2执行时都会进入wait(),所以谁先进入wait()也就不一定了。
而处于wait状态的等待线程是存在于线程池中的,当主函数interrupt的时候,t1和t2抢占资源的顺序也是随即的。
所以t1和t2谁先被唤醒也就不确定了。
解释一下你的第一种情况:
t1线程先运行进入wait状态,t2后进入wait状态。
等到主线程执行到num==60的时候开始终端wait状态的t1和t2,
t1和t2开始抢占CPU资源,当然在这t1先抢到,所以t1先执行,t2后执行。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2