我正在尝试在scala中执行多个线程,对于一个简单的测试我运行此代码:
Executors.newFixedThreadPool(20).execute( new Runnable {
override def run(): Unit = {
println("Thread Started!")
}
})
据我所知,它会创建20个线程并调用 打印功能,但这不是正在发生的事情。它只创建一个 线程,执行打印并挂起。
有人能解释一下这种现象吗?
答案 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();
这里的锁存器确保线程在继续之前等待彼此。没有它,在提交另一个线程之前,可以轻松地在一个线程上完成这些简单的工作,因此您不会使用池中的所有线程。