Java Executorservice工作线程未在单独的线程中运行
我使用newFixedThreadPool同时向服务器套接字提供传入请求。由于某些原因,服务于客户端的工作类没有在单独的线程中运行。当我向套接字发送多个请求时,请求将按顺序得到服务,而不是像它们应该同时得到服务。我正在运行OpenJDK1.8.077,如果这有什么不同的话 这是我主要课程的摘录:Java Executorservice工作线程未在单独的线程中运行,java,multithreading,sockets,threadpool,executorservice,Java,Multithreading,Sockets,Threadpool,Executorservice,我使用newFixedThreadPool同时向服务器套接字提供传入请求。由于某些原因,服务于客户端的工作类没有在单独的线程中运行。当我向套接字发送多个请求时,请求将按顺序得到服务,而不是像它们应该同时得到服务。我正在运行OpenJDK1.8.077,如果这有什么不同的话 这是我主要课程的摘录: ExecutorService executorService = Executors.newFixedThreadPool(100); ServerSocket serverSocke
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);
}
}
}
}
问题是这个电话:
executorService.execute(new ConnectionHandler(socket));
允许execute
方法强制调用线程阻塞,直到任务完成,甚至让调用线程执行实际工作。相反,请执行以下操作:
executorService.submit(new ConnectionHandler(socket));
这将使用池中的线程异步运行您的任务。对不起,我对计算机不太在行
问题是我在一个循环中将许多消息回显到套接字,但是echo命令按顺序发送消息,并等待每条消息完成后再发送下一条消息 我很难相信这一点。ExecutorService的API文档中的示例代码使用execute。请阅读此处的javadoc-它说调用线程可能用于执行工作:@NathanHughes是对的-这两种方法仅在签名方面不同,在线程方面的行为不一样。使用“newFixedThreadPool”创建的执行器将任务分配给不同的线程。我知道
execute
的不同实现有异步执行的自由,但我会犹豫是否使用任何允许与需要相反的行为的接口。最坏的情况是,实现允许调用线程执行规范中所述的工作。submit
方法规范强烈暗示异步执行,指出任务计划稍后执行,而execute
仅表示这是可能的,但并不总是如此。Oracle JVM可能会异步实现它,但OpenJDK或任何其他JVM供应商可能不会。为什么要听天由命呢?但当您不仅使用接口,而且创建实现时,您知道执行策略是什么。Executors.newFixedThreadPool(100)必须在任何实现上创建多线程执行器。您如何知道它没有使用不同的线程?记录线程名称以确保。您确定这不是测试客户端的问题吗?