2013-11-04 118 views
2

我必須同時執行我的類的多個實例。我寫下面的代碼如下。我以兩種方式完成了它。但我沒有看到區別。平行運行線程的正確方法是什麼?並行執行java中的多線程

謝謝。

這裏的片段:

public class MyClass { 

     public MyClass() { 
      runnable = true; 
     } 

     public boolean isRunnable() { 
      return runnable; 
     } 

     public static void main(String[] args) throws InterruptedException { 

      /* METHOD 1 
      MyClass myclass = new MyClass(); 

      if (myclass.isRunnable()) { 
       for (int i = 0; i < loop; i++) { 
        myclass.execTask();  
        Thread.sleep(sleep); 
       } 
      } 
      */ 

        //METHOD 2 
      final MyClass myclass = new MyClass(); 


      ExecutorService threadPool = Executors.newFixedThreadPool(threadNo); 

      for (int i = 0; i < threadNo; i++) { 
       threadPool.submit(new Runnable() { 
        public void run() { 
         for (int i = 0; i < loop; i++) { 
         myclass.execTask(); 
          try { 
           Thread.sleep(sleep); 
          } catch (InterruptedException ex) { 
           Logger.getLogger(MyClass.class.getName()).log(Level.SEVERE, null, ex); 
          } 
         } 
        } 
       }); 
      } 
      threadPool.shutdown(); 

      public void execTask(){ 
      ......... 
      } 
     } 
    } 
+0

平行或同時? –

+0

BTW:'myclass.execTask;'什麼也不做 - 你應該至少使用'myclass.execTask();'。 – OldCurmudgeon

+0

已更正。謝謝指出。 – user907810

回答

5

的區別你的兩種方法之間的是,在「方法2,」你實際上可能有多個執行線程(假設threadNo大於1)。方法2允許多個工作線程並行地(同時,準確地)並行地獲取Runnable並呼叫execTask(通過呼叫run)。 「方法2」中的停頓幾乎沒有任何東西。

「方法1」完全在「主」線程上執行。它調用execTask,等待,然後再次調用它。這將連續調用執行幾次。

(我認爲這是僞代碼,因爲它的一部分將無法編譯。)

這裏是一個清理的「方法2」。請注意,我有threadNo工作線程(如果它大於1,它會有所幫助),並且我創建了loopRunnables

ExecutorService threadPool = Executors.newFixedThreadPool(threadNo); 

for (int i = 0; i < loop; i++) { 
    threadPool.submit(new Runnable() { 
     public void run() { myclass.execTask(); }); 
} 
+0

是的這是僞代碼,因此很多錯別字! – user907810

+0

所以我可以刪除睡眠?如果我只循環一次,我看到只有一個任務正在執行。我仍然認爲threadpool提交會同時啓動所有'threadNo'線程。 – user907810

+0

我編輯了答案,以便正確使用方法2更清晰一些。 –