为什么 FixedThreadPool 不能正常工作

Why FixedThreadPool not working properly

这是我的以下代码:

    ExecutorService executor = Executors.newFixedThreadPool(5);

    executor.submit(new Runnable() {
        public void run() {
            for (int i = 0; i < 5; i++) {
              System.out.println("Start"+"  "+Thread.currentThread().getName());
              try {
                Thread.sleep(100);
              } catch (InterruptedException e) {
                e.printStackTrace();
              }
              System.out.println("End!"+"  "+Thread.currentThread().getName());
            }
        }
    });

    executor.shutdown();
    executor.awaitTermination(1, TimeUnit.SECONDS);

这是我的输出:

    Start  pool-1-thread-1
    End!  pool-1-thread-1
    Start  pool-1-thread-1
    End!  pool-1-thread-1
    Start  pool-1-thread-1
    End!  pool-1-thread-1
    Start  pool-1-thread-1
    End!  pool-1-thread-1
    Start  pool-1-thread-1
    End!  pool-1-thread-1

我的理解是,在我的代码中 FixedThreadPool 中有 5 个线程。所以当我 运行 我的代码时,它应该输出所有 5 线程,对吧?还是我误会了什么?

在我的输出中 thread-1 每次都开始和结束,但是当它在 for 循环中循环时不应该输出所有 5 线程吗? 因为如果只有 1thread 在做 task 那么为什么我们还需要 5 threads? 有什么方法可以让所有5个线程都在控制台输出吗?(我是新手)

您只发布了一个 Runnable,所以您的 ExecutorService 运行了一个任务。它将只使用一个线程。要使用多线程,您必须多次调用 submit,或者您可以使用 Collection 可运行对象调用 invokeAll

编辑

像这样:

public void test() {
    int numberOfThreads = 5;
    ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads);
    for(int i=0; i<numberOfThreads; i++){
        executorService.submit(createRunnable());
    }
}

private Runnable createRunnable() {
    return new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println("Start" + "  " + Thread.currentThread().getName());
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("End!" + "  " + Thread.currentThread().getName());
            }
        }
    };
}