Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当一个单独的线程处于睡眠状态时,java应用程序关闭是否不好?_Java_Multithreading_Thread Safety_Sleep_Shutdown - Fatal编程技术网

当一个单独的线程处于睡眠状态时,java应用程序关闭是否不好?

当一个单独的线程处于睡眠状态时,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>这完全取决于它所做的事情。当程序退出时,进

例如,如果我有一个java命令行程序,它生成一个新线程(thread#2)来进行一些轮询,然后休眠5分钟。程序的主线程(线程#1)正在运行,然后在线程#2的5分钟结束之前完成,因此程序将退出。这有什么问题吗?我是否应该在该程序的主函数结束之前中断线程1中的线程2?

这可能被一些人认为是不好的做法和设计不良的迹象,但原则上用
系统终止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。