2015-11-01 40 views
0

我正在創建一個多線程服務器,它將接收來自客戶端的消息,處理併發回結果。如何停止服務器線程(並可能稍後激活它)?

問題是,當我想服務器線程停止,它不會。

即使設置了stopFlag=true,客戶端仍然可以連接到服務器並獲得結果。

如何停止服務器線程(並可能稍後激活它)?

我嘗試了所有這些,但他們沒有奏效。

Close listening ServerSocket

Java server socket program after one day it stops listening

Close listening ServerSocket http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html

public class ServerStart implements Runnable{ 

private JTextArea servLog; 
private boolean stopFlag=false; 
public ServerStart(JTextArea servLog){ 
    this.servLog=servLog; 
} 

public void setStopFlag(boolean stop){ 

    stopFlag=stop; 

} 


@Override 
public void run() { 
    int port=444; 
    try { 
     ServerSocket serverSock = new ServerSocket(port); 

     synchronized(this){ 
      while(!stopFlag){ 
       Socket clientSock=null; 
       try{ 
       clientSock = serverSock.accept(); 



       }catch(IOException e){ 
        if(stopFlag){ 
        System.out.println("Server stop");  
        return; 
        } 
        throw new RuntimeException("Error accepting client connection", e); 

       } 
       Thread listener = new Thread(new Socket_test(clientSock, port,servLog)); 
       listener.start(); 
      } 

       serverSock.close(); 
     } 




    } catch (IOException ex) { 
     Logger.getLogger(ServerStart.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

}

+0

這很好,你提到你已經嘗試過的東西,但也請添加什麼,當你嘗試每一種解決方案都無法正常工作。 – RealSkeptic

+0

那麼,他們不會顯示任何錯誤。客戶端和服務器運行良好。 唯一的問題是,即使設置了stopFlag,我也無法關閉服務器線程。 – raynus

+0

你真的嘗試第三個解決方案*完全*嗎?包括其中有* synchronized方法*的事實? – RealSkeptic

回答

0

您需要打斷你的插座accept()方法,在等待的東西從客戶端讀取。在接受可以做,或致電close() from another thread

其次超時,您stopRun變量應該是揮發性的,因此它可以在其他線程可以看出,當updated

+0

謝謝!它就像一個魅力! – raynus