1

我试图创建多线程服务器,它将接收来自不同客户端的消息,然后发回消息。我正在使用执行服务器来管理线程的创建。但我不确定我是否做得对,我以前没有使用过执行人服务吗?我对这条线 executor.execute(new Handler(client));处理程序有问题是抽象的,无法初始化?如何解决?执行服务会解决绑定端口的问题吗?它会像客户的请求队列一样吗?提前谢谢

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(){
         //............   

    }

}
4

1 回答 1

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);

在多线程服务器中,每次客户端连接时,服务器都会创建一个新线程,并且该线程用于该客户端的工作。这就是为什么您将此线程定义为内部类并实现可运行接口的原因。

于 2013-04-14T23:01:33.643 回答