我是多线程新手,遇到线程问题并锁定程序。
我通过创建下面的代码简化了我的问题
private final ConcurrentLinkedQueue<String> valueQueue = new ConcurrentLinkedQueue<String>();
private final Object lock = new Lock();
private ProcessValue processor = new ProcessValues();
public void addValue(String value){
synchronized (lock) {
valueQueue.add(value);
lock.notify();
}
}
public void waitForValuesToBeAdded(){
synchronized (lock) {
lock.wait();
executeValues();
}
}
public void executeValues(){
synchronized (lock) {
processor.processValues();
valueQueue.clear();
lock.notify()
}
}
程序启动时执行waitForValuesToBeAdded
。顾名思义,这只是等待将值添加到队列中。添加值后,我们不再wait
,因此调用executeValues()
。
执行processor.processValues()
时,我不希望将值添加到队列(valueQueue.add(value)
)。我需要他们等到processValues()
完成。
我想如果我使用同步块它将阻止插入但是当我在执行processValue
时添加另一个值时,所有内容都会挂起。
我的节目中遗漏了什么吗?
答案 0 :(得分:0)
尝试使用visualvm查看线程被阻止的位置。您可以执行“线程转储”来分析它。
答案 1 :(得分:0)
重写如下:
private final ConcurrentLinkedQueue<String> valueQueue = new ConcurrentLinkedQueue<String>();
private final Object lock = new Lock();
private ProcessValue processor = new ProcessValues();
public void addValue(String value) {
synchronized (lock) {
valueQueue.add(value);
lock.notifyAll();
}
}
public void waitForValuesToBeAdded() throws InterruptedException {
synchronized (lock) {
while (valueQueue.size() == 0) {
lock.wait();
}
executeValues();
}
}
public void executeValues() {
synchronized (lock) {
processor.processValues();
valueQueue.clear();
lock.notifyAll()
}
}