关于一个多线程DEMO,Interrupt后是否会再次发生死锁
该多线程DEMO如下,
问题在于主线程中的
这个代码段如果把t1 interrupt后,假如CPU立刻给它执行权,那么此时主线程尚未将flag置为false,这时t1执行完毕后判断flag为true,又进入阻塞,同理t2也可能这样,那么st.changeFlag()是不是就没什么意义了?但是我昨晚试了很多遍都是一个三个线程顺利结束,无法出现t1或t2等待的状态,请问我考虑的情况到底会发生么?
package cn.haiyisoft18;
public class ThreadStopDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
for (int i = 1; i <= 50; i++) {
if (i == 40) {
t1.interrupt();
t2.interrupt();
st.changeFlag();
}
System.out.println("MAIN----" + i);
}
System.out.println("MAIN------" + "OVER");
}
}
class StopThread implements Runnable {
private boolean flag = true;
@Override
public synchronized void run() {
// TODO Auto-generated method stub
while (flag) {
try {
wait();
} catch (InterruptedException ie) {
// TODO: handle exception
System.out.println(Thread.currentThread().getName() + "-----" + ie.toString());
}
System.out.println(Thread.currentThread().getName() + "------" + "hello");
}
}
public void changeFlag() {
this.flag = false;
}
}问题在于主线程中的
for (int i = 1; i <= 50; i++) {
if (i == 40) {
t1.interrupt();
t2.interrupt();
st.changeFlag();
}这个代码段如果把t1 interrupt后,假如CPU立刻给它执行权,那么此时主线程尚未将flag置为false,这时t1执行完毕后判断flag为true,又进入阻塞,同理t2也可能这样,那么st.changeFlag()是不是就没什么意义了?但是我昨晚试了很多遍都是一个三个线程顺利结束,无法出现t1或t2等待的状态,请问我考虑的情况到底会发生么?
...全文
相关推荐
线程Demo.zip
生命周期管理包括线程的启动、暂停、恢复、停止和中断等操作,需要注意的是,直接终止线程可能导致资源泄漏,因此通常建议使用interrupt()方法。
Java Thread多线程详解及用法解析
- **stop()**:停止线程,这个方法非常危险,因为可能会导致资源泄露,已被废弃。- **interrupt()**:中断线程,线程在执行过程中可以检查是否被中断,并相应处理。
java线程知识的相关代码
**线程的中断**:可以通过`Thread.interrupt()`方法中断一个线程,线程在适当的地方检查`isInterrupted()`或`interrupted()`,以响应中断请求。
java线程同步及通信
**死锁**和**活锁**: 虽然示例中未直接涉及,但在实际应用中,线程同步可能导致死锁(两个或多个线程相互等待对方释放资源导致的僵局)或活锁(线程不断重试导致的无法前进状态)。
多线程在Visual_Studio_C_的应用实例教程
- `CurrentThread`: 获取当前正在运行的线程对象。- `IsAlive`: 判断线程是否仍在执行。


Java SE
