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.notify();
    }
}

public void waitForValuesToBeAdded(){
        synchronized (lock) {
        lock.wait();
        executeValues();
    }
}

public void executeValues(){
        synchronized (lock) {
        processor.processValues();
        valueQueue.clear();
        lock.notify()
    }
}

当程序启动时,它会执行waitForValuesToBeAdded。顾名思义,这只是等待将值添加到队列中。当值被添加时,我们不再waitexecuteValues()调用。

执行时processor.processValues()我不希望将值添加到队列 ( valueQueue.add(value)) 中。我需要他们等到processValues()完成。我想如果我使用同步块,它会阻止插入,但是当我在processValue执行时添加另一个值时,一切都会挂起。

我错过了我的程序中的某些内容吗?

4

2 回答 2

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()
    }
}
于 2013-05-15T13:19:59.263 回答
0

尝试使用 jvisualvm 查看线程被阻塞的位置。你可以做一个“线程转储”来分析这个。

于 2013-04-26T21:04:24.687 回答