簡體   English   中英

線程同步問題(在java中)

[英]Thread synchronization question (in java)

我的java應用程序有一個加載任務,需要兩個可以並行化的服務器調用。 所以我啟動了一個Thread t1(執行task1 )和一個Thread t2(for task2 )。 我希望在其他任務(1和2)結束時執行特定任務task3 當然我不知道task1task2中哪一個會先完成...

哪個是最簡單(也是最安全)的代碼編碼方式?

謝謝您的幫助

你有幾個選擇:

  1. 如果task3在一個單獨的線程上並且task1和task2線程對其任務是獨占的(沒有線程池)並在任務完成時完成,則可以使用{T1.join(); T2.join();}等待兩個線程。 優點:簡單。 缺點:情況很少那么簡單。
  2. 如果task3位於單獨的線程上,則可以使用在所有線程之間共享的java.util.concurrent.CountDownLatch。 任務3將等待鎖存器,而task1和task2將減少它。 優點:相當容易,不注意環境。 缺點:要求T3在真正需要之前創建。
  3. 如果task3只應在task1和task2完成之后創建(在task1和task2完成之后沒有單獨的線程),你必須構建一些更復雜的東西。 我建議您創建自己的ExecutorService,該條件是未來的條件,只在條件發生變化時執行未來,或者創建一個管理服務來檢查條件並根據這些條件提交給定的期貨。 記住,這是我的頭腦,可能有更簡單的解決方案。 優點:資源友好。 缺點:復雜。

您可以join t1t2 (按任意順序),然​​后在加入后運行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...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM