我尝试创建多线程服务器,它将接收来自不同客户端的消息,然后发回消息。我正在使用执行服务器来管理创建
线程。但我不确定我是否正在做它,我以前没有使用过执行服务?我有这条线的问题
executor.execute(new Handler(client));
处理程序是抽象的,无法初始化?怎么解决?将绑定端口执行服务解决问题?它会像客户的请求队列一样smth吗? thx提前
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(){
//............
}
}
答案 0 :(得分: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);
在多线程服务器中,每次客户端连接时,服务器都会创建一个新线程,并且此线程适用于此客户端的工作。这就是为什么你要将这个线程定义为内部类并实现runnable接口。