如何在 运行 时中断或终止 java 线程
How to interrupt or kill a java thread while it's running
阅读了几篇关于如何终止 Java 线程的 SO 帖子后,我相当理解为什么停止 不安全 以及如何处理正常停止。
但解决方案针对的是 UI 线程,其中重绘是问题所在,并不是很长 运行 - 线程执行的阻塞进程。
链接:
How do you kill a Thread in Java?
https://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
我无法从解决方案或示例中理解的一个精确点是样本试图模拟的长 运行 部分是什么。
例如:在下面的代码中,如果我将间隔设置为 INT.MAX。
public void run() {
Thread thisThread = Thread.currentThread();
while (blinker == thisThread) {
try {
thisThread.sleep(interval); // This might take forever to complete,
// and while may never be executed 2nd time.
synchronized(this) {
while (threadSuspended && blinker==thisThread)
wait();
}
} catch (InterruptedException e){
}
repaint();
}
}
public synchronized void stop() {
blinker = null;
notify();
}
我问这个用例的原因是,我在遗留代码库中有一个错误,它在线程中运行另一个可执行文件。
现在询问用户是否希望停止线程,我们需要终止该线程,并且作为该线程一部分的可执行文件会自动被终止。
停止线程的方法是要求它——很好地——停止。这取决于线程 运行 侦听并根据该请求采取行动的代码。
具体的做法是打断线程。您的代码检查中断 - 如果线程在执行之前或期间被中断,Thread.sleep
和 Object.wait
将抛出 InterruptedException
;但是你抓住了中断,并忽略了它,所以你不会对它采取行动。
而不是这个:
while (condition) {
try {
Thread.sleep(...);
wait();
} catch (InterruptedException e) {
}
}
将中断放在循环外:
try {
while (condition) {
Thread.sleep(...);
wait();
}
} catch (InterruptedException e) {
}
然后循环如果被中断就终止。
阅读了几篇关于如何终止 Java 线程的 SO 帖子后,我相当理解为什么停止 不安全 以及如何处理正常停止。
但解决方案针对的是 UI 线程,其中重绘是问题所在,并不是很长 运行 - 线程执行的阻塞进程。
链接:
How do you kill a Thread in Java? https://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
我无法从解决方案或示例中理解的一个精确点是样本试图模拟的长 运行 部分是什么。
例如:在下面的代码中,如果我将间隔设置为 INT.MAX。
public void run() {
Thread thisThread = Thread.currentThread();
while (blinker == thisThread) {
try {
thisThread.sleep(interval); // This might take forever to complete,
// and while may never be executed 2nd time.
synchronized(this) {
while (threadSuspended && blinker==thisThread)
wait();
}
} catch (InterruptedException e){
}
repaint();
}
}
public synchronized void stop() {
blinker = null;
notify();
}
我问这个用例的原因是,我在遗留代码库中有一个错误,它在线程中运行另一个可执行文件。 现在询问用户是否希望停止线程,我们需要终止该线程,并且作为该线程一部分的可执行文件会自动被终止。
停止线程的方法是要求它——很好地——停止。这取决于线程 运行 侦听并根据该请求采取行动的代码。
具体的做法是打断线程。您的代码检查中断 - 如果线程在执行之前或期间被中断,Thread.sleep
和 Object.wait
将抛出 InterruptedException
;但是你抓住了中断,并忽略了它,所以你不会对它采取行动。
而不是这个:
while (condition) {
try {
Thread.sleep(...);
wait();
} catch (InterruptedException e) {
}
}
将中断放在循环外:
try {
while (condition) {
Thread.sleep(...);
wait();
}
} catch (InterruptedException e) {
}
然后循环如果被中断就终止。