【问题标题】:Why FixedThreadPool not working properly为什么 FixedThreadPool 不能正常工作
【发布时间】:2016-09-30 14:46:26
【问题描述】:

这是我的以下代码:

    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线程在控制台上输出吗?(我是新手)

【问题讨论】:

  • 您已提交一项任务。为什么你希望它在 5 个线程上运行?
  • 我是新手,是的,我现在知道了。谢谢。

标签: java multithreading threadpool


【解决方案1】:

您只发布了一个Runnable,因此您的ExecutorService 运行一项任务。它将只使用一个线程。要使用多个线程,您必须多次调用submit,或者您可以使用Collection 的runnables 调用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());
            }
        }
    };
}

【讨论】:

  • 谢谢,我明白了。但是你能不能给我一些invokeAll的代码。我不知道如何使用invokeAll。将不胜感激。
  • 你到底想要什么? 5个线程,每个线程都打印出开始和结束消息?还是 5 个线程,每个线程有 5 个迭代循环,所以每个线程会打印 5 条开始和 5 条结束消息?
  • 我希望每个线程都有一个 5 次迭代循环,因此每个线程将打印 5 条开始和 5 条结束消息。
  • 好的,我已经添加了一个示例
  • 但是你说我们甚至可以用invokeAll 来做到这一点。那么我该如何处理invokeAll。我不想要整个代码。我知道execute.invokeAll() 是我所要做的,但我应该在invokeAll() 参数中写什么。
猜你喜欢
  • 2016-07-16
  • 2019-01-04
  • 2020-09-03
  • 2016-10-10
  • 2016-10-24
  • 2017-02-27
  • 2017-07-08
  • 2014-11-23
  • 2021-03-07
相关资源
最近更新 更多