2013-04-14 122 views
1

我試圖創建多線程服務器,它將接收來自不同客戶端的消息,然後發回消息。我正在使用執行服務器來管理 線程的創建。但我不確定我是否願意這樣做,我以前沒有使用過執行者服務?而且我對這行有問題 executor.execute(new Handler(client));處理程序是抽象的,無法初始化?如何解決它?執行服務解決綁定端口問題?它會讓客戶端的請求排隊嗎? THX提前tcp多線程服務器java

package serverx; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.logging.Handler; 


public class ServerX { 

    public static void main(String [] args){ 

    ExecutorService executor = Executors.newFixedThreadPool(30); 

    ServerSocket server; 
    try{ 

     server= new ServerSocket(5555); 
     System.out.println ("Server started!"); 

     while(true) { 
      try{ 
       Socket client = server.accept(); 

       //Thread t= new Thread (new Handler(client)); 
       //t.start(); 
       executor.execute(new Handler(client));  
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

    }catch (IOException el){ 
     el.printStackTrace(); 
    } 

    } 
} 

處理程序:

public class Handler implements Runnable{ 

     private Socket client; 

     public Handler(Socket client){ 
      this.client=client;} 
     public void run(){ 
     //............ 

    } 

} 

回答

2

您的處理器不能是抽象的。使您的處理程序類內部並定義您的客戶端套接字以外的while循環。

Socket client; 
while(true) { 
try{ 
client = server.accept(); 
executor.execute(new Handler(client)); 
} 

我想添加更多關於您的問題;

ExecutorService非常擅長控制線程數量。如果「30」不是你的要求,你也可以定義你的線程數。 :

int poolSize = 50 * Runtime.getRuntime().availableProcessors(); 
ExecutorService tasks = Executors.newFixedThreadPool(poolSize); 

在多線程的服務器上,每個客戶端連接時,服務器將創建一個新線程,該線程適用於該客戶端的工作。這就是爲什麼你要將此線程定義爲內部類並實現可運行接口。

+0

thx很多,我把它作爲內部類(所以我刪除公共類Handler實現Runnable),現在它的工作。所以服務器只會在30個線程之後停止,但是如果一段時間後它不能收到任何線程,我能否停止工作?如果它是可能的?或者我只能改變這個值「30」 – chajka

+0

@chajka不客氣,你也可以接受我的答案感謝。 對於你的其他問題,其實我以前沒做過。當你啓動你的服務器時,它不會停止,直到你打破它。也許你可以考慮一個休息條件(在while循環中)滿足你的需求。 – oko

+0

完成,我不知道這個機會) – chajka