我正在使用newFixedThreadPool同时向服务器套接字提供传入请求。由于某种原因,为客户端提供服务的工作类不会在单独的线程中运行。当我向套接字发送多个请求时,请求按顺序提供,而不是像应该的那样同时提供。我正在运行OpenJDK 1.8.0_77,如果这有任何区别。
这是我主要课程的摘录:
ExecutorService executorService = Executors.newFixedThreadPool(100);
ServerSocket serverSocket = new ServerSocket(5656);
while(true) {
Socket socket = serverSocket.accept();
executorService.execute(new ConnectionHandler(socket));
}
这是我的工人阶级:
public class ConnectionHandler implements Runnable {
private Socket socket;
public ConnectionHandler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
BufferedReader reader = null;
PrintWriter writer = null;
try {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream(), true);
while(true) {
String line = reader.readLine();
if(line == null) break;
writer.println("Echo: " + line);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
if(reader != null) reader.close();
if(writer != null) writer.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
答案 0 :(得分:1)
抱歉,我对电脑不满意。
问题在于我在循环中回显了许多消息到套接字,但是echo命令按顺序发送消息并在发送下一个消息之前等待每个消息完成。
答案 1 :(得分:0)
问题是这个电话:
executorService.execute(new ConnectionHandler(socket));
允许execute
方法强制调用线程阻塞,直到任务完成,或者甚至让调用线程执行实际工作。相反,这样做:
executorService.submit(new ConnectionHandler(socket));
这将使用池中的线程异步运行您的任务。