簡體   English   中英

編寫靜態同步方法(等待線程的結果)

[英]Write a static synchronized method (wait for a result from thread)

我的任務有問題。 也就是說,我們必須編寫一個從Threads調用的類。 其中一種方法是:

public static synchronized void waitForResults() {

}

因此,Master-Thread調用此方法,然后Master-Thread觸發另一個Thread,即要完成新工作。 我怎么能告訴Master-Thread他睡覺,而Worker-Thread有效?

使用wait()notify()機制。 每個java對象都擁有這些方法。 機制阻塞線程直到滿足某些條件。

例如,如果您的主線程調用另一個將更改result變量值的線程。 然后,您可以wait result直到它被其他一些線程notified

private static StringBuilder result= new StringBuilder();

public static void mainThreadWork() {
    new WorkerThread().start();
    synchronized (result) {
        System.out.println(result.toString()); //prints ""
        result.wait();
        System.out.println(result.toString()); //prints "modified"
    }
}

private static class WorkerThread extends Thread {
    @Override
    public void run() {
        synchronized(result) {
            result.append("modified");
            result.notify();
        }
    }
}

會發生什么:當一個線程調用某個對象的wait時,它會向其他線程產生一個CPU,並且(如方法名所示)等待另一個線程在該線程上發送一個notify信號。 notify將CPU輸出到正在等待該對象的線程。

必須遵守一些規則,例如,必須在synchronized塊內調用wait()notify()


從Java 1.5開始,有更多抽象級別的同步和等待通知機制,因此您可以檢查java的concurrent 它允許您在更抽象的對象級別上鎖定和等待對象:

private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();

因此,而不是synchronized塊和waitsnotifies你可以只:

public static void mainThreadWork() {
    lock.lock();

    new WorkerThread().start();
    System.out.println(result.toString()); //prints ""
    condition.await();
    System.out.println(result.toString()); //prints "modified"

    lock.unlock();
}

WorkerThread

@Override
public void run() {
    lock.lock();

    result.append("modified");
    condition.singal();

    lock.unlock();
}

暫無
暫無

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

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