【发布时间】:2016-10-11 12:19:19
【问题描述】:
我的项目的非常简化的版本。 MyThread 的多个实例尝试获取和删除Set 定义在MyWorker 类中的一个元素形式并对其进行一些处理。
在我的其余代码(此处未粘贴)中,我至少有一个线程在MyWorker 中填充Set,因此ParseNextPendingElement() 不会在Set 中找到元素。
我的问题是我不知道如何在空集上“锁定”线程。现在我在访问 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;
}
}
【问题讨论】:
标签: java multithreading synchronization locks