【发布时间】:2013-02-13 23:53:43
【问题描述】:
我正在制作一个简单的服务器,它将产生多个线程来处理多个客户端。我想知道在服务器终止时关闭和关闭所有各种流和线程的正确方法。
我添加了一个shutdownHook,它运行一个告诉服务器关闭的方法。反过来,服务器将关闭调用广播到它已打开的所有线程,这会将每个线程中的“isClosed”布尔值设置为 true。
我期望的是,每个线程在到达 run() 方法的末尾并再次循环时,会遇到 while(!isClosed) 条件,从而通过关闭所有正确的套接字/流来正确终止自己和回来了。
但是,我不知道这是否会正确关闭所有内容,因为程序应该在 shutdownhook 完成后终止。它完成得相当早,因为它所做的只是传播结束消息。这是否意味着某些线程没有足够的时间正确关闭?
如果是这样,最好的方法是让shutdownhook手动关闭每个线程,确保它们在返回之前已经关闭?
【问题讨论】:
-
基本方法没有错,但您也可以查看
Thread.interrupt(),以防您的线程中有任何阻塞调用。 (请注意,并非所有此类调用都是可中断的 - 我相信常规套接字读取不是。) -
如果它们是非守护线程,那么 JVM 在所有线程都从它们的 run 方法返回之前不会退出,无论 shutdownHook 方法是否返回。
-
使用 executorservice 管理您的线程并在完成后关闭 executorservice。
标签: java multithreading sockets