2014-09-26 34 views
1

我想了解java中的ExecutorService。當我使用1個線程或4個線程時,沒有太大的性能差異。我有一個四核CPU,我沒有任何其他進程在運行。Java中ExecutorService的性能

ExecutorService exService = Executors.newFixedThreadPool(4); 
exService.execute(new Test().new RunnableThread()); 
exService.awaitTermination(25, TimeUnit.SECONDS); 

class RunnableThread implements Runnable { 
     @Override 
     public void run() { 
      StopWatch stopWatch = new StopWatch(); 
      stopWatch.start(); 
      long cnt = 0;  
      for (cnt = 0; cnt < 999999999; cnt++) { 
       try { 
        for (long j = 0; j < 20; j++){ 
         x += j; 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      stopWatch.stop(); 
      System.out.println(stopWatch.getTime()); 
     } 
    } 

如果我的理解是正確的,當我說newFixedThreadPool(4)正確時,我的任務應該有接近4倍的性能改進?

+1

如果你提交任務列表,你會看到它,然後它會並行執行它,一個任務不會被分配到多個線程 – 2014-09-26 00:36:24

+0

在這個例子中,你只是一個線程,但即使如此,這樣的瑣碎代碼即使使用多線程,您也不會看到任何加速。 – 2014-09-26 00:37:07

回答

5

不幸的是,線程的工作負載分配沒有任何魔力。

每個任務都在其自己的線程上運行。它不會以某種方式自動轉換爲併發執行路徑。

如果您只有一個任務,其餘三個線程將空閒。

如果您可以將工作負載分解爲可以同時運行的多個任務(並且必須自行拆分),那麼多線程只會加快速度。

2

如果我的理解是正確的,當我說newFixedThreadPool(4)正確時,我的任務應該有接近4倍的性能改進?

是的,如果你實際上運行4個併發任務。

當前,您有一個任務要提交給執行者。假設它需要10秒。即使您有4個內核和4個線程,Java也不能並行處理單個任務。但是,如果您提交了4個獨立的任務(沒有內存或鎖爭用),那麼您將在10秒內看到所有這些任務完成1個任務。