gpt4 book ai didi

java - static volatile boolean - 线程没有被终止

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:55:55 28 4
gpt4 key购买 nike

我编写了简单的多线程应用程序,只是为了玩弄并发,但我在控制线程循环的 boolean 变量方面遇到了问题。如果队列中没有元素,其中一个函数应该停止线程,我想这是我的问题,因为如果我在大括号之间添加一些东西:

while (!queue.isEmpty()) {
}
isRunning = false;

所以它变成了:

while (!queue.isEmpty()) {
System.out.println("ASD");
}
isRunning = false;

它工作得更好一些 - 程序在执行 turnOff 方法后终止

有什么想法吗?

这是我的应用程序的完整代码:

package test;

public class xxx {
public static void main(String[] args) {
Foo instance = Foo.getInstance();
Thread x = new Thread(instance);
x.start();

for (int count = 1; count < 100000; count++)
instance.addToQueue(count + "");
instance.turnOff();
}
}

和:

package test;

import java.util.LinkedList;
import java.util.List;

public class Foo implements Runnable {
private static Foo inner = null;
private static List<String> queue = new LinkedList<String>();
private volatile static boolean isRunning = false;

private Foo() { }

public static Foo getInstance() {
if (inner == null) {
inner = new Foo();
}
return inner;
}

public void addToQueue(String toPrint) {
synchronized (queue) {
queue.add(toPrint);
}

}

public void removeFromQueue(String toRemove) {
synchronized (queue) {
queue.remove(toRemove);
}
}

public void turnOff() {
while (!queue.isEmpty()) {
}
System.out.println("end");
isRunning = false;
}

@Override
public void run() {
isRunning = true;
while (isRunning) {
if (!queue.isEmpty()) {
String string = queue.get(0);
System.out.println(string);
removeFromQueue(string);
}

}
}
}

最佳答案

这是一个竞争条件问题。可能 run 方法(另一个线程)在主线程中的 turnOff 之后执行,因此标志 isRunning 再次设置为 true 并且循环永远不会结束。

这可以解释为什么使用简单的 System.out.println("ASD") 会变得更好:isRunning=false 被延迟了。

关于java - static volatile boolean - 线程没有被终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22814392/

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