Executorservice worker不是在单独的线程中运行

时间:2016-05-04 18:21:07

标签: java multithreading sockets threadpool executorservice

我正在使用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);
        }
        }
    }

    }

2 个答案:

答案 0 :(得分:1)

抱歉,我对电脑不满意。

问题在于我在循环中回显了许多消息到套接字,但是echo命令按顺序发送消息并在发送下一个消息之前等待每个消息完成。

答案 1 :(得分:0)

问题是这个电话:

executorService.execute(new ConnectionHandler(socket));

允许execute方法强制调用线程阻塞,直到任务完成,或者甚至让调用线程执行实际工作。相反,这样做:

executorService.submit(new ConnectionHandler(socket));

这将使用池中的线程异步运行您的任务。