gpt4 book ai didi

java - 如何避免在 Java 中忙于自旋

转载 作者:搜寻专家 更新时间:2023-11-01 02:25:04 24 4
gpt4 key购买 nike

我有一个多线程应用程序,其中一个线程向另一个线程发送消息。等待线程轮询消息并使用react(处理锁)。像这样:

等待线程代码:

while(true)
{
if(helloArrived())
System.out.println("Got hello");
if(byeArrived())
System.out.println("Got bye");
if(stopArrived())
break;
}

我想避免这种占用 CPU 的技术,而改用其他方法。有什么想法吗?

编辑:实际代码如下:

BlockingQueue<Mail> killMeMailbox = new LinkedBlockingQueue<Mail>();
BlockingQueue<Mail> messageMailbox = new LinkedBlockingQueue<Mail>();

public void run()
{
while(true)
{
if(killMeMailbox.size() > 0)
{
break;
}
if(messageMailbox.size() > 0)
{
System.out.println(messageMailbox.poll());
}
}
}

public void receiveMail(Mail mail)
{
//kill
if(mail.from == -1)
{
killMeMailbox.add(0);
}
else
{
//other
try
{
messageMailbox.put(mail);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}

最佳答案

避免这种情况的正确方法是使用 java.lang.Object 实现的等待/通知机制,或 Java 类库提供的更高级别的并发机制之一:

(选择最适合您的特定用例的机制...)


使用Thread.sleep 不是一个好的解决方案。虽然您减少了 CPU 负载(与轮询循环相比),但另一方面是您降低了响应能力。


I'm using a BlockingQueue now. But maybe I'm doing it incorrectly. I just added the actually code above. Do you see my problem?

是的。您正在以一种旨在避免阻塞的方式使用队列。这是错误的做法。您应该使用 take()(它将阻塞直到条目可用)而不是 poll(),并去掉测试队列大小的代码。

你的“killMeMailbox”东西似乎是为了让你停止等待邮件而设计的。您应该能够使用 Thread.interrupt 来实现它。 (中断将解锁 take() 调用 ...)

关于java - 如何避免在 Java 中忙于自旋,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26543064/

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