2014-11-13 72 views
0

我有以下問題產生了。我有一個退出命令,它應該終止服務器,包括由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()。有效的解決方案

+1

可能的重複http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java –

+0

我*認爲* BufferedReader拋出一個IOExecption,如果它被中斷。我會嘗試嘗試。 – markspace

+0

對System.exit *的調用將*終止所有正在運行的線程,不會提出任何問題。這是「硬」的方式。 – Durandal

回答

1

嘗試關閉所有客戶端套接字。在這種情況下,所有讀線程都應拋出IOException。

+0

我該怎麼做?我不跟蹤使用的插座。它們是在相應客戶端的衍生線程中創建的,因此我無法訪問它。 –

+0

是的,你應該跟蹤所有的插座。您可以通過將套接字傳遞給某個共享的持有者對象來完成。即'Socket s = ...; holder.add(s)' –

+0

我不認爲這是這個問題的最佳解決方法,但它的工作,所以我會接受你的答案。 –