【问题标题】:Lock thread while resource is empty资源为空时锁定线程
【发布时间】:2016-10-11 12:19:19
【问题描述】:

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

在我的其余代码(此处未粘贴)中,我至少有一个线程在MyWorker 中填充Set,因此ParseNextPendingElement() 不会在Set 中找到元素。

我的问题是我不知道如何在空集上“锁定”线程。现在我在访问 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 multithreading synchronization locks


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多