Java 执行器NewFixedThreadPool未给出预期结果

Java 执行器NewFixedThreadPool未给出预期结果,java,multithreading,scala,executorservice,Java,Multithreading,Scala,Executorservice,我试图在scala中执行多个线程,为了进行简单测试,我运行以下代码: Executors.newFixedThreadPool(20).execute( new Runnable { override def run(): Unit = { println("Thread Started!") } }) 据我所知,它将创建20个线程并调用 打印功能,但实际情况并非如此。它只创建一个 线程,执行打印并挂起 有人能解释一下这种现象吗?它挂起的

我试图在scala中执行多个线程,为了进行简单测试,我运行以下代码:

Executors.newFixedThreadPool(20).execute( new Runnable {
      override def run(): Unit = {        
        println("Thread Started!")
      }
})
据我所知,它将创建20个线程并调用 打印功能,但实际情况并非如此。它只创建一个 线程,执行打印并挂起


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

它挂起的原因是您没有关闭
执行器服务。在Java中(抱歉,不熟悉Scala):

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

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

如果您想在不同的线程中实际执行此操作20次,则需要a)提交20个可运行文件;b) 同步可运行程序,以便它们实际需要在单独的线程上运行:

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();
CountdownLatch闩锁=新的CountdownLatch(1);
ExecutorService executor=Executors.newFixedThreadPool(20);
对于(int i=0;i<20;++i){
执行者。执行(()->{
latch.await();//为清晰起见,省略了异常处理。
System.out.println(“…”);
});
}
倒计时();
executor.shutdown();

这里的闩锁确保线程在继续之前彼此等待。如果没有它,在提交另一个线程之前,很容易在一个线程上完成琐碎的工作,因此您不会使用池中的所有线程。

我假设此代码在单个线程上运行得足够快,以便线程池不需要分配任何额外的线程。您创建了20个线程,并且只对其中一个线程进行了工作。这与执行速度无关:如果你不给线程做任何事情,线程将不会做任何事情。因此,我有一个kafka消费池,我想为每个线程添加一个消费者,代码并不快(需要一段时间),但仍然只有一个线程。要使它不挂起,需要
shutdown()
线程池。线程池中的线程不是立即分配的,而是根据需要延迟创建的。
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();