My project的非常简化版本。 MyThread
的多个实例尝试获取并删除Set
类中定义的MyWorker
形式的一个元素,并对其进行一些处理。
在我的其余代码中(未粘贴在此处)我在Set
中至少有一个填充MyWorker
的帖子,因此ParseNextPendingElement()
永远不会找到元素的风险设置。
我的问题是我不知道如何在空集上“锁定”线程。现在,我在访问Set失败后实现了原始延迟。 如何同时等待Set拥有至少一个元素而不是在等待时压力CPU?
public class MyThread implements Runnable {
private MyWorker worker;
//constructors, get, set, etc.
public void run() {
worker.ParseNextPendingElement();
}
}
private static class MyWorker {
private Set set;
//constructors, get, set, etc.
public void ParseNextPendingElement() {
Object elemToParse;
while(1) {
synchronized(set) {
if(!set.isEmpty()) {
elemToParse = set.remove();
break;
}
}
// BRUTAL workaround to not stress CPU while waiting for
// at least one element in set.
Thread.delay(100);
}
// Do some stuff with elemToParse
return;
}
}
答案 0 :(得分:3)
如果您希望线程行为进入等待状态,并在您有新输入时返回,那么这听起来就像来自LinkedBlockingQueue
java.util.concurrent
的{{1}}作业包而不仅仅是一个Set。
LinkedBlockingQueue
有一个方法take()
,如果队列为空,它将进入等待状态的线程,并在其中有新项目时返回。