【发布时间】:2014-04-03 08:40:35
【问题描述】:
我写了一个简单的多线程应用程序,只是为了玩并发,但我有一个布尔变量的问题,它控制线程中的循环。如果队列中没有剩余元素,其中一个函数应该停止线程,我想这是我的问题,因为如果我在大括号之间添加一些东西:
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);
}
}
}
}
【问题讨论】:
-
你知道
while (!queue.isEmpty()) {}会做什么吗?它将消耗所有您的 CPU 资源,因为它将不断检查单个标志/位/值的状态,该标志/位/值很可能存储在 CPU 寄存器中。通常你会想要添加一个 `wait();'或循环中的类似语句 -
编译器优化你的代码并踢出空循环,因为他认为它没有做任何事情
-
请看我的帖子。
-
相反,您链接的问题与我的问题重复,因为它是 4 天前提出的,截至目前
标签: java multithreading concurrency