资源为空时锁定线程

时间:2016-10-11 12:19:19

标签: java multithreading synchronization locks

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;
    }
}

1 个答案:

答案 0 :(得分:3)

如果您希望线程行为进入等待状态,并在您有新输入时返回,那么这听起来就像来自LinkedBlockingQueue java.util.concurrent的{​​{1}}作业包而不仅仅是一个Set。

LinkedBlockingQueue有一个方法take(),如果队列为空,它将进入等待状态的线程,并在其中有新项目时返回。