1. ホーム
  2. java

[解決済み] javaに「条件が真になるまでブロックする」関数はありますか?

2023-04-29 09:14:04

質問

サーバーのリスナースレッドを書いているのですが、現在使用しているのは

while (true){
    try {
        if (condition){
            //do something
            condition=false;
        }
        sleep(1000);

    } catch (InterruptedException ex){
        Logger.getLogger(server.class.getName()).log(Level.SEVERE, null, ex);
    }
}

上記のコードでは、run関数がループすることでCPU時間を食ってしまうという問題が発生しています。 sleep 関数は動作しますが、これはその場しのぎの修正であり、解決策ではありません。

変数 '条件' が '真' になるまでブロックするような関数はあるでしょうか。 それとも、変数の値が変化するまで待つという、継続的なループが標準的な方法なのでしょうか?

どのように解決するのですか?

このような投票は、間違いなく最も好ましくない解決方法です。

条件を真にするために何かをする別のスレッドがあると仮定します。スレッドを同期させる方法はいくつかあります。あなたのケースで最も簡単なものは、オブジェクトを介した通知でしょう。

メインスレッド

synchronized(syncObject) {
    try {
        // Calling wait() will block this thread until another thread
        // calls notify() on the object.
        syncObject.wait();
    } catch (InterruptedException e) {
        // Happens if someone interrupts your thread.
    }
}

他のスレッド

// Do something
// If the condition is true, do the following:
synchronized(syncObject) {
    syncObject.notify();
}

syncObject 自体は、単純な Object .

スレッド間通信の方法は他にもたくさんありますが、どれを使うかは、正確には何をするかによります。