Java:在线程中`while(true){...}`循环不好吗?有什么选择?

Mr.*_*ndy 26 java concurrency multithreading loops message-passing

while (true) { ... }循环的线程不好?有什么选择?

更新; 我想要做什么......

我有~10,000个线程,每个线程都使用来自其私有队列的消息.我有一个线程一个接一个地生成消息并将它们放在正确的消费者队列中.每个消费者线程无限循环,检查消息是否出现在队列中并进行处理.

在Consumer.java里面:

@Override
public void run() {
    while (true) {
        Message msg = messageQueue.poll();
        if (msg != null) {
            ... // do something with the message
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Producer正在快速地将消息放入消费者消息队列中(每秒数百万条消息).消费者应该尽快处理这些消息!

注意:while (true) { ... }由Producer作为最后一条消息发送的KILL消息终止.但是,我的问题是关于做这个消息传递的正确方法......

有关此设计,请参阅新问题.

JRL*_*JRL 18

您可以选择检查中断状态,而不是永远循环,断开或返回.

while (!Thread.currentThread().isInterrupted()) {
    try {
        doWork();
        wait(1000);
    } catch (InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你的线程是由ExecutorService管理的任务,你只需通过调用shutdownNow()就可以优雅地结束它们.

  • 最好使用Thread.sleep(1000)而不是wait(),cz wait要求首先阻塞对象. (6认同)

unp*_*680 8

while (!stop_running) { ... }
Run Code Online (Sandbox Code Playgroud)

...也许?某种退出标志通常用于控制线程运行.

  • 如果这样做,请确保stop_running使用volatile关键字.请参阅Java Concurrency In Practice,第7.1节. (10认同)

Eri*_*lje 8

不是天生就没有.你可以随时使用break或保释return.只要确保你真的这样做(在某些时候)

问题是当你的线程无关时会发生什么?如果你只是绕着检查一个条件,你的线程将占用整个CPU什么都不做.因此,请确保使用wait导致您的线程阻塞,或者sleep如果您没有任何东西可以wait使用.


Ste*_*all 1

通常,您需要wait某种资源来完成工作,这会向您隐藏实际的线程详细信息。听起来您想实现自己的spinlock

这是我在谷歌上找到的一些关于锁定的教程。