执行者NewFixedThreadPool没有给出预期的结果

时间:2017-03-08 07:37:23

标签: java multithreading scala executorservice

我正在尝试在scala中执行多个线程,对于一个简单的测试我运行此代码:

Executors.newFixedThreadPool(20).execute( new Runnable {
      override def run(): Unit = {        
        println("Thread Started!")
      }
})
  

据我所知,它会创建20个线程并调用   打印功能,但这不是正在发生的事情。它只创建一个   线程,执行打印并挂起。

有人能解释一下这种现象吗?

1 个答案:

答案 0 :(得分:2)

它挂起的原因是你没有关闭ExecutorService。在Java中(抱歉,不熟悉Scala):

ExecutorService executor = Executors.newFixedThreadPool(20); // or 1.
executor.execute(() -> System.out.println("..."));
executor.shutdown();

至于为什么你只看到一次消息:你创建了20个线程,并且只给其中一个线程工作。如果您不给他们任何事情,线程将不会做任何事情。

我认为您假设此代码将在池中的每个线程上执行runnable 。事实并非如此。

如果你想在不同的线程中实际执行20次,你需要a)提交20个runnables; b)同步runnable,以便它们实际上需要在不同的线程上运行:

CountdownLatch latch = new CountdownLatch(1);
ExecutorService executor = Executors.newFixedThreadPool(20);
for (int i = 0; i < 20; ++i) {
  executor.execute(() -> {
    latch.await();  // exception handling omitted for clarity.
    System.out.println("...");
  });
}
latch.countdown();
executor.shutdown();

这里的锁存器确保线程在继续之前等待彼此。没有它,在提交另一个线程之前,可以轻松地在一个线程上完成这些简单的工作,因此您不会使用池中的所有线程。