我希望主线程正在运行,因为我有一些侦听器将侦听另一个线程中的请求/消息,并且我不希望我的主线程死掉。
哪个更好?
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);
}
}
答案 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。这样就不需要侦听器了。