使用Thread.sleep与CountDownLatch保持主线程运行

时间:2019-01-20 13:32:17

标签: java multithreading

我希望主线程正在运行,因为我有一些侦听器将侦听另一个线程中的请求/消息,并且我不希望我的主线程死掉。

哪个更好?

CountDownLatch

public static void main(String[] args) throws InterruptedException {

    startListener();
    CountDownLatch latch = new CountDownLatch(1);
    latch.await();

}

或者在睡觉的时候

public static void main(String[] args) throws InterruptedException {

    startListener();
    while (true){
        Thread.sleep(1000);
    }

}

3 个答案:

答案 0 :(得分:3)

假设侦听器线程为a non-daemon thread,则可以让主线程结束。只要有非守护程序线程正在执行,JVM就会继续运行。

如果您计划实施正常关机,则

CountDownLatch将是更好的解决方案。您可以点击闩锁,并通过执行清除逻辑让主线程结束。考虑一下应用程序如何关闭,例如当侦听器正在从队列中读取消息时,您会收到SIGTERM信号,然后呢?

答案 1 :(得分:2)

没有。

首先,如果startListener()创建一个新线程,则即使主线程完成,应用程序也将继续运行。只要至少有一个非守护进程线程在运行,那是真的。 (这与C / C ++不同,在C / C ++中,应用程序以main结尾。您可能会感到困惑。)

关于您显示的选项。两者都会创建一个无限循环(没有存在的方式),这可能不是最佳实践。但是,如果必须选择其中之一,则latch会更好,因为它不会每秒消耗CPU。

答案 2 :(得分:0)

两种建议的方法都可以,但是我建议在输入消息的同步处理中使用主线程。然后,将以更少的资源(线程)更快地处理消息。参见A Simple Example of Synchronous Message Receives。这样就不需要侦听器了。