Java Executorservice工作线程未在单独的线程中运行

Java Executorservice工作线程未在单独的线程中运行,java,multithreading,sockets,threadpool,executorservice,Java,Multithreading,Sockets,Threadpool,Executorservice,我使用newFixedThreadPool同时向服务器套接字提供传入请求。由于某些原因,服务于客户端的工作类没有在单独的线程中运行。当我向套接字发送多个请求时,请求将按顺序得到服务,而不是像它们应该同时得到服务。我正在运行OpenJDK1.8.077,如果这有什么不同的话 这是我主要课程的摘录: ExecutorService executorService = Executors.newFixedThreadPool(100); ServerSocket serverSocke

我使用newFixedThreadPool同时向服务器套接字提供传入请求。由于某些原因,服务于客户端的工作类没有在单独的线程中运行。当我向套接字发送多个请求时,请求将按顺序得到服务,而不是像它们应该同时得到服务。我正在运行OpenJDK1.8.077,如果这有什么不同的话

这是我主要课程的摘录:

    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)必须在任何实现上创建多线程执行器。您如何知道它没有使用不同的线程?记录线程名称以确保。您确定这不是测试客户端的问题吗?