2012-10-29 157 views
3

我編寫了一個小的TCP線程服務器,它爲每個server.accept()創建一個新的線程。幾乎所有的工作都很好,但是我遇到了每個中斷都要殺死所有線程的問題。 (我使用ServiceExecutor來管理線程,因此我使用shutdownNow方法來訪問中斷方法)Worker-instances使用BufferedReader,它是readline方法來接收和計算輸入。 AFAIK readline塊不會對中斷發生反應,但是如何阻止它呢?關閉TCP線程服務器

while(!isInterrupted()){ 

    try { 
      clientSocket = this.serverSocket.accept(); 
     } catch(IOException e){ 
      break; 
     } 

     this.threadPool.execute(new ThreadWorker(clientSocket)); 
    } 

    threadPool.shutdownNow(); 

    try{ 
     serverSocket.close(); 
    }catch(IOException e){ 
     //todo 
    } 

我試圖關閉的ServerSocket殺輸入/輸出流,但如預期沒有奏效。

+3

理想情況下,不要調用無限期阻塞的方法。 –

+0

參見http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java?rq=1和http://stackoverflow.com/questions/1948317/forceful-termination線程卡在某種方法上的某種方法?rq = 1 – DNA

+0

在'C'中,我會說只是發送一個信號。 – alk

回答

4

幾個選擇:

1)如果您關閉整個應用程序,並沒有什麼重要意義的顯式關閉,調用System.exit(0)。健康警告 - 這樣做會導致一些開發人員發生中風,並無休止地發出「優雅地清理」信息。

2)保留accept()線程中所有客戶端套接字的線程安全列表。將對此列表的引用作爲客戶端上下文的一部分傳遞給客戶端服務器線程。在accept()線程中向列表中添加新連接。當客戶端線程檢測到斷開連接時,從列表中刪除它的條目。當你想關閉所有客戶端時,迭代列表並關閉客戶端套接字 - 這將導致readline方法在客戶端線程中提前返回,並出現錯誤。

+0

+1爲'中風'。 – grieve