gpt4 book ai didi

java - 关于线程中止和死锁的问题 - volatile 关键字

转载 作者:行者123 更新时间:2023-12-03 12:57:35 25 4
gpt4 key购买 nike

我在理解如何停止正在运行的线程时遇到了一些麻烦。我将尝试通过示例来解释它。假设有以下类:

public class MyThread extends Thread {
protected volatile boolean running = true;

public void run() {
while (running) {
synchronized (someObject) {
while (someObject.someCondition() == false && running) {
try {
someObject.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// do something useful with someObject
}
}
}

public void halt() {
running = false;
interrupt();
}
}

假设线程正在运行并且以下语句的计算结果为真:
while (someObject.someCondition() == false && running)

然后,另一个线程调用 MyThread.halt()。即使此函数将 'running' 设置为 false(这是一个可变 boolean 值)并中断线程,以下语句仍会执行:
someObject.wait();

我们陷入僵局。线程永远不会停止。

然后我想出了这个,但我不确定它是否正确:
public class MyThread extends Thread {
protected volatile boolean running = true;

public void run() {
while (running) {
synchronized (someObject) {
while (someObject.someCondition() == false && running) {
try {
someObject.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// do something useful with someObject
}
}
}

public void halt() {
running = false;
synchronized(someObject) {
interrupt();
}
}
}

这样对吗?这是最常见的方法吗?

这似乎是一个显而易见的问题,但我没有想出解决方案。非常感谢你的帮助。

最佳答案

interrupt() 调用将在被中断的线程中设置一个标志, someObject.wait() 将 always检查这个标志,所以你的第一个类应该可以工作。 AFAIC 第一种是常见的方式,您的错误必须在其他地方。

关于java - 关于线程中止和死锁的问题 - volatile 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2967474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com