繁体   English   中英

Java:正确关闭多个线程

[英]Java: Closing multiple threads properly

我正在制作一个简单的服务器,它将生成多个线程来处理多个客户端。 我想知道在终止服务器时关闭和关闭所有各种流和线程的正确方法。

我添加了一个shutdownHook,它运行告诉服务器关闭的方法。 反过来,服务器将关闭调用广播到它已打开的所有线程,这会将每个线程中的“ isClosed”布尔值设置为true。

我期望的是,每个线程在到达run()方法的末尾并再次循环运行时,都会达到while(!isClosed)条件,从而通过关闭所有适当的套接字/流并返回来正确地终止自身。

但是,我不知道这是否可以正确关闭所有内容,因为该程序应在关闭挂机完成后终止。 由于它所做的只是传播关闭消息,因此它相当早完成。 这是否意味着某些线程将没有足够的时间正确关闭?

如果是这样,最好的方法是让shutdownhook在返回之前手动关闭每个线程,确保它们已关闭吗?

使用ExecutorService是现代的方法。 它占用了代码中那么多巧妙的位。

是一个不错的起点。

您是正确的,如果服务器终止,线程可能没有足够的时间正确终止。 但是,根据您要尝试执行的操作,这可能会或可能不会出现问题。 如果不需要清理工作,那么您可能不必担心,因为线程突然终止不会造成任何问题。

但是,如果需要完成清理工作(例如写入数据库),那么您还需要其他工作。 最好的方法(使用Java)是使用Executor / ExecutorService和相关项目( http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html )。 这些可以很好地解决您的问题,此外,您还可以获得一些不错的免费赠品,例如线程池管理,因此扩展变得更加容易。 如果为每个客户生成一个新线程,则稍后尝试扩展时会遇到很大的问题,因为例如每分钟不能创建一百万个线程。

如果您习惯使用原始线程,那么使用Excecutor的东西会有些调整,但这值得研究。 祝好运!

shutdownHook在周期中发生得太晚,以至于无法以这种方式使用。 预计它将很快完成,并且JVM已经处于关闭状态,如果它们是守护程序,则可能会将现有线程与它一起使用。

我只是将连接超时设置为15-30秒。 如果发生超时(SocketTimeoutException) ,请关闭套接字并退出线程。 客户当然必须处理掉线的连接,但是他们必须已经这样做。 然后,当您要关闭时,只需停止接受新的连接即可(例如,关闭ServerSocket并使其接受线程正确处理产生的异常)。 当所有现有连接线程均已退出时,JVM将退出,这实际上应该不超过超时时间加上最长事务的时间。 确保连接线程不是守护程序。

如果您不介意客户在交易中被砍掉,只需调用System.exit().

您是否考虑过将线程守护进程线程化。 只需添加t.setdaemon(true); 在调用线程的start方法之前。 如果这些线程应在程序结束时结束,则使它们成为守护程序将在所有其他非守护程序线程结束后将其杀死。 线程池中使用的线程是应该作为守护程序的线程的一个很好的例子。 我真的认为这对您可能有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM