2013-04-14 123 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