gpt4 book ai didi

java - 资源为空时锁定线程

转载 作者:行者123 更新时间:2023-11-29 04:39:09 25 4
gpt4 key购买 nike

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

在我的其余代码中(此处未粘贴),我至少有一个线程正在填充 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.util 中的 LinkedBlockingQueue 的工作.concurrent 包而不仅仅是一个 Set。

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

关于java - 资源为空时锁定线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39977101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com