线程和锁定在我的程序中

时间:2013-04-26 18:04:11

标签: java multithreading thread-safety locking

我是多线程新手,遇到线程问题并锁定程序。

我通过创建下面的代码简化了我的问题

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时添加另一个值时,所有内容都会挂起。

我的节目中遗漏了什么吗?

2 个答案:

答案 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()
    }
}