2017-03-08 83 views
-1

我試圖在Scala中執行多個線程和一個簡單的測試,我運行此代碼:執行人的newFixedThreadPool沒有給出預期的結果

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

至於我能理解,這將創建20個線程並打電話給 打印功能,但這不是發生了什麼事情。它只創建一個 線程,執行打印並掛起。

有人可以解釋我這種現象嗎?

+0

我會假設這段代碼在單個線程上運行得足夠快,以便線程池不需要分配任何額外的線程。 –

+0

你創建了20個線程,並且只讓其中一個工作。這不是關於執行速度:如果你不給他們任何事情做,線程將不會做任何事情。 –

+0

所以,我有一個kafka消費池,我想爲每個線程添加一個消費者,代碼不是很快(這是一段時間),但仍然只有一個線程。 –

回答

2

它掛起的原因是您不關閉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(); 

鎖存這裏確保線程繼續之前等待對方。沒有它,在提交另一個線程之前,可以輕鬆地在一個線程上完成簡單的工作,這樣就不會使用池中的所有線程。