1

タスクに問題があります。つまり、スレッドから呼び出されるクラスを作成する必要があります。方法の 1 つは次のとおりです。

public static synchronized void waitForResults() {

}

したがって、Master-Thread がこのメソッドを呼び出すと、Master-Thread が別の Thread をトリガーし、新しい作業が行われます。ワーカースレッドが動作している間、マスタースレッドに彼が眠っていることをどのように伝えることができますか?

4

1 に答える 1

3

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 を譲ります。

たとえば、一部のルールは尊重する必要がwait()あり、ブロックnotify()内で呼び出す必要があります。synchronized


concurrent Java 1.5 以降、より抽象的なレベルの同期と待機通知メカニズムがあるため、Java のライブラリを確認できます。より抽象的なオブジェクトのようなレベルでオブジェクトをロックして待機することができます。

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

したがって、synchronizedブロック and waitsandの代わりに、次のnotifiesようにすることができます。

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();
}
于 2013-06-16T10:23:28.147 に答える