Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

スレッドの待機

以下コードで、SampleThreadが別モジュールを実行して、その実行終了結果を受けてEventListenerがtransfer関数を呼ぶような実装があったとして、
仮にSampleThread瞬時に終わり、runメソッドのwait関数を実行する前に、
notifyAll()が実行されることがありますでしょうか?
synchronizedしているから問題ないかが心配なところです。

通常は、notifyAllが先に実行された後に、waitが実行されて、無期限に待機状態になってしまうことを防ぐために、wait実行前に、実行条件を設ける実装をするかと思いますが、その実装は必要でしょうか?

public class Sample extends Thread implements EventListener {

    public Sample() {
        this.start();
    }

    /**
     * メイン処理メソッド
     */
    public void run() {
        synchronized (this) {
            try {
                SampleThread thread = new SampleThread();
                thread.start();

                this.wait();
            } catch (InterruptedException e) {
            }
        }
    }

    /**
     * 結果を受け取るためのリスナです。
     */
    public void transfer() {

        synchronized (this) {
            this.notifyAll();
        }
    }

}

1

回答

305

閲覧

1件の回答

評価

0

例えば方々にSystem.out.println(???)を入れて、this.wait()の前にThread.sleep(5000)とでも入れた上で実行したらどうなるか?
>仮にSampleThread瞬時に終わり
が実際に発生するのか。

回答する

ログインしていません。

ログインしなくても回答はできますが、ログインすると、質問・回答の管理、更新があった場合のメールでの通知を受けることができます。 アカウントをお持ちでない方は会員登録を行ってください。

ユーザ名匿名