我有以下問題產生了。我有一個退出命令,它應該終止服務器,包括由ExecutorService
衍生的所有線程。在與客戶端相關的每個特定Thread
中,我有一個while
-loop,其中我正在使用關聯套接字的InputStream
等待客戶端的輸入。我也有一個全局變量boolean
,它表示服務器是否在線。只要它變成false
,我就打破循環並終止線程。它基本上是這樣的:如何終止線程的ExecutorService
// userInput - String
// in - BufferedReader associated with the input stream of the client's socket
while ((userInput = in.readLine()) != null && serverIsOnline) {
//do some stuff
}
然而,問題是in.readLine()
是阻塞操作,因此,除非所有客戶端的東西鍵入整個服務器將不會終止。 ExecutorService.shutDownNow()
也不起作用,因爲在這種情況下中斷無效,因爲線程被另一個操作阻塞。我也想避免System.exit()
。有效的解決方案
可能的重複http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java –
我*認爲* BufferedReader拋出一個IOExecption,如果它被中斷。我會嘗試嘗試。 – markspace
對System.exit *的調用將*終止所有正在運行的線程,不會提出任何問題。這是「硬」的方式。 – Durandal