它掛起的原因是您不關閉ExecutorService
。在Java(對不起,不熟悉斯卡拉):
ExecutorService executor = Executors.newFixedThreadPool(20); // or 1.
executor.execute(() -> System.out.println("..."));
executor.shutdown();
至於爲什麼你只看到消息一次:創建20個線程,並給予只是其中之一工作。如果你不給他們做任何事情,線程將不會做任何事情。
我想你認爲這個代碼將在池中每個線程上執行的可運行。事實並非如此。
如果你想在不同的線程中做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();
鎖存這裏確保線程繼續之前等待對方。沒有它,在提交另一個線程之前,可以輕鬆地在一個線程上完成簡單的工作,這樣就不會使用池中的所有線程。
我會假設這段代碼在單個線程上運行得足夠快,以便線程池不需要分配任何額外的線程。 –
你創建了20個線程,並且只讓其中一個工作。這不是關於執行速度:如果你不給他們任何事情做,線程將不會做任何事情。 –
所以,我有一個kafka消費池,我想爲每個線程添加一個消費者,代碼不是很快(這是一段時間),但仍然只有一個線程。 –