资源为空时锁定线程

Lock thread while resource is empty

我的项目的非常简化的版本。 MyThread 的多个实例尝试获取和删除 MyWorker class 中定义的一种元素形式 Set 并对其进行一些处理。

在我的其余代码中(此处未粘贴),我至少有一个线程正在 MyWorker 中填充 Set,因此不存在 ParseNextPendingElement() 永远找不到的风险集合中的元素。

我的问题是我不知道如何 "lock" 在空集上穿线。现在我在访问 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.util.concurrent 包中 LinkedBlockingQueue 的工作只是一套。

LinkedBlockingQueue有一个方法take(),如果队列为空,线程会进入等待状态,有新元素时会返回。