当一个单独的线程处于睡眠状态时,java应用程序关闭是否不好?
例如,如果我有一个java命令行程序,它生成一个新线程(thread#2)来进行一些轮询,然后休眠5分钟。程序的主线程(线程#1)正在运行,然后在线程#2的5分钟结束之前完成,因此程序将退出。这有什么问题吗?我是否应该在该程序的主函数结束之前中断线程1中的线程2?这可能被一些人认为是不好的做法和设计不良的迹象,但原则上用当一个单独的线程处于睡眠状态时,java应用程序关闭是否不好?,java,multithreading,thread-safety,sleep,shutdown,Java,Multithreading,Thread Safety,Sleep,Shutdown,例如,如果我有一个java命令行程序,它生成一个新线程(thread#2)来进行一些轮询,然后休眠5分钟。程序的主线程(线程#1)正在运行,然后在线程#2的5分钟结束之前完成,因此程序将退出。这有什么问题吗?我是否应该在该程序的主函数结束之前中断线程1中的线程2?这可能被一些人认为是不好的做法和设计不良的迹象,但原则上用系统终止JVM应该没有任何问题。退出。如果线程#2没有要执行的清理,则不会 另一个问题是,5月2日的线程是否在某个动作的中间。 < P>这完全取决于它所做的事情。当程序退出时,进
系统终止JVM应该没有任何问题。退出
。如果线程#2没有要执行的清理,则不会
另一个问题是,5月2日的线程是否在某个动作的中间。 < P>这完全取决于它所做的事情。当程序退出时,进程将终止,并将带上任何附加线程。唯一的潜在问题是线程2是否持有某些资源句柄。但是,如果它所做的只是读取,那么就不会有问题。在main完成执行后,非deamon线程会继续在后台运行。
因此,除非显式调用
System.exit
,否则将有大量线程。不过,最好的方法是停止线程2。
只需在thread#2中使用状态标志,例如
布尔骰子
。线程#1将中断线程#2,然后线程#2将看到模具标志(由线程#1设置)设置为true,将执行任何必要的清理并优雅地退出。
在你的例子中,线程2只是睡了5分钟,什么也不做,这将很好。看一看 对于java程序的终止,所有非守护进程线程都必须首先终止。
一旦所有非守护进程线程停止执行,JVM将杀死所有守护进程线程,因此将被关闭
在您的情况下,应该不会有任何问题,除非并且直到您的
线程2
正在执行一些重要的功能,如处理资源。此外,如果线程可以在任何时候安全地“终止”,它可以(或者确实应该)标记为守护进程。程序不会因为主功能终止而结束。所有非守护进程线程都必须终止,程序才能正常终止。请记住让die标志的类型为AtomicBoolean
或至少为volatile。