2008-10-08 87 views
4

我的Java應用程序有一個加載任務,它需要兩個可以並行化的服務器調用。所以我啓動一個線程t1(做task1)和一個線程t2(用於task2)。 我想然後執行特定任務,任務3當兩個其他任務(1 & 2)都結束時。當然,我不能告訴的TASK1TASK2將首先完成...線程同步問題(在java中)

這將是你最簡單的(和最安全)的實現代碼?

謝謝您的幫助

回答

7

你有幾種選擇:

  1. 如果TASK3是一個單獨的線程和任務1和Task2線程專屬自己的任務(沒有線程池)和完成時任務完成後,可以使用{T1.join(); T2.join();}等待這兩個線程。優點:容易。缺點:情況很少如此簡單。
  2. 如果task3位於單獨的線程上,則可以使用所有線程之間共享的java.util.concurrent.CountDownLatch。任務3將等待鎖存器,而task1和task2將減少鎖存器。優點:很容易,忘了環境。缺點:需要T3在真正需要之前創建。
  3. 如果task3只能在task1和task2完成之後創建(直到task1和task2完成之後才能創建單獨的線程),則必須構建一些更復雜的東西。我建議您創建自己的ExecutorService,除了將來有條件之外,只有在條件發生變化時才執行未來,或者創建一個管理服務來檢查條件並根據這些條件提交給定的期貨。請記住,這是我的頭等大事,可能會有更簡單的解決方案。優點:資源友好。缺點:複雜。
2

可以joint1t2(以任何順序),然​​後運行後加入TASK3。

+0

如果你這樣做,task1和task2不會並行化... – gizmo 2008-10-08 07:46:26

0

在task3中實現偵聽器接口,並將其註冊到task1 & task2。 Task1和Task2必須在結束之前調用其監聽器。這樣做,你可以在task3中記錄哪個任務已經完成,當兩者都完成後,你可以執行你的第三個任務。

當然,如果你的TASK1/2可以用一個異常退出,不要忘了把TASK3其UncaughtExceptionHandler的

0

我不想終止2個工作線程(TASK1和Task2 )當他們完成他們的工作時,那麼你可以等待task3中的一個條件,直到其他兩個完成。事情是這樣的:

public class Master { 

    private Object monitor_ = new Object(); 
    private boolean task1Finished_; 
    private boolean task2Finished_; 

    class Task1 extends Thread { 

     public void run() { 
      // do stuff 
      synchronized (monitor_) { 
       task1Finished_ = true; 
       monitor_.notifyAll(); 
      } 
      // keep on working 
     } 
    } 

    class Task2 extends Thread { 

     public void run() { 
      // do stuff 
      synchronized (monitor_) { 
       task1Finished_ = true; 
       monitor_.notifyAll(); 
      } 
      // keep on working 
     } 
    } 

    class Task3 extends Thread { 

     public void run() { 
      synchronized (monitor_) { 
       while (!task1Finished_ || !task2Finished_) { 
        try { 
         monitor_.wait(); 
        } 
        catch (InterruptedException ignored) { 
        } 
       } 
      } 
      // do stuff 
     } 
    } 
    // start tasks1, task2 and task3... 
}