我的Java應用程序有一個加載任務,它需要兩個可以並行化的服務器調用。所以我啓動一個線程t1(做task1)和一個線程t2(用於task2)。 我想然後執行特定任務,任務3當兩個其他任務(1 & 2)都結束時。當然,我不能告訴的TASK1和TASK2將首先完成...線程同步問題(在java中)
這將是你最簡單的(和最安全)的實現代碼?
謝謝您的幫助
我的Java應用程序有一個加載任務,它需要兩個可以並行化的服務器調用。所以我啓動一個線程t1(做task1)和一個線程t2(用於task2)。 我想然後執行特定任務,任務3當兩個其他任務(1 & 2)都結束時。當然,我不能告訴的TASK1和TASK2將首先完成...線程同步問題(在java中)
這將是你最簡單的(和最安全)的實現代碼?
謝謝您的幫助
你有幾種選擇:
可以join
都t1
和t2
(以任何順序),然後運行後加入TASK3。
在task3中實現偵聽器接口,並將其註冊到task1 & task2。 Task1和Task2必須在結束之前調用其監聽器。這樣做,你可以在task3中記錄哪個任務已經完成,當兩者都完成後,你可以執行你的第三個任務。
當然,如果你的TASK1/2可以用一個異常退出,不要忘了把TASK3其UncaughtExceptionHandler的
我不想終止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...
}
如果你這樣做,task1和task2不會並行化... – gizmo 2008-10-08 07:46:26