我想启动一个线程,中断它并启动一个新线程。问题是,这不起作用。第一个线程启动并被中断,但是下一个线程在它甚至可以启动之前被中断。所以interrupt()会中断旧线程和新线程。输出如下:
run()-method starts
Thread Counter:0
Thread Counter:1
Thread Counter:2
Thread Counter:3
Thread Counter:4
Thread Counter:5
Thread Counter:6
8 seconds are over
Thread is not null
Thread will be interrupted now
catch
run()-method starts
catch
8 seconds are over
Thread is not null
Thread will be interrupted now
....
您可以看到该线程第一次启动。然后线程被中断并调用'catch'。到现在为止还挺好。在此之后,下一个线程将开始,但是这次线程立即被中断并且'run'在'run() - 方法启动'之后立即被调用。
所以,我无法弄清楚为什么会这样。我不希望两个线程快速连续中断。
这是我的代码:
public class MyRunnable {
static Thread myThread;
static boolean stop;
static Runnable myRunny = new Runnable() {
@Override
public void run() {
System.out.println("run()-method starts");
try {
int j = 0;
while (!stop) {
Thread.sleep(1000);
System.out.println("Thread Counter:"+j);
j++;
}
} catch (InterruptedException e) {
System.out.println("catch");
myThread.interrupt();
}
};
};
public static void main(String[] args){
myThread = null;
while(true) {
stop = false;
if(myThread != null) {
System.out.println("Thread is not null ");
System.out.println("Thread will be interrupted now");
myThread.interrupt();
}
myThread = new Thread(myRunny);
myThread.start();
try {
Thread.sleep(8000);
System.out.print("8 seconds are over "+ "\n");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
答案 0 :(得分:2)
catch (InterruptedException e) {
System.out.println("catch");
myThread.interrupt();
}
在调用myThread.interrupt()之前,myThread字段被替换为新引用,因此您中断了新线程!
答案 1 :(得分:1)
所以interrupt()会中断旧线程和新线程。
您的诊断不正确。对Thread.interrupt的调用将中断一个线程一次。
您的示例正在中断一个线程,该线程正在捕获InterruptedException
并中断异常处理程序中的第二个线程。正在不同线程上快速连续进行两次调用到interrupt
。
我不希望两个线程快速连续中断。
改变
} catch (InterruptedException e) {
System.out.println("catch");
myThread.interrupt();
}
到
} catch (InterruptedException e) {
System.out.println("catch");
}