2

私は現在のスレッドを見ていました: ブール変数が真になるのを待つスレッドを作成する方法は?

誰もがお互いに反対しているように見え、誰も十分に説明していなかったので、これを最も簡単な方法で提示します. これが今日の私のコードです。

boolean connecting = false;

public static void main(String[] args) {
    initUI();
    while(true) {
        if(connecting) {
            connecting = false;
            doSomething();
        }
    };
}

initUI() は、ユーザー インターフェイスを開始するメソッドです。ユーザーが「Connect」というクラスのボタンをクリックすると、アクション リスナーが呼び出され、ブール値の「connecting」が「true」に設定されます。if 領域に入ると、ブール値が「false」にリセットされ、必要なコードが実行されます。

ただし、これは機能します... CPUの使用量が多すぎます。

ボタン アクション リスナーを doSomething() メソッドに直接設定すると、ボタンをリセットするためにアクション リスナー メソッドを終了する必要があるため、プログラムがジャムします (また、そうする必要があります)。ただし、doSomething() にはループ (チャット プログラム) があるため、切断するまで元の while (ここにコードで表示されています) には戻りません。

だから私の質問は、ブール値がtrueに変わるのを「待つ」ことはありますか?例えばリスナー?

回答: Joni のおかげで、スレッドを実装しました。

ボタン actionListener には以下が含まれるようになりました。

(new connectThread()).start();

そして、私のスレッドは次のようになります。

public class connectThread extends Thread {
    public void run() {
        ui.btn.setEnabled(false);
        doSomething();
        ui.btn.setEnabled(true);
    }
}

質問のタイトルについては、ブール値が変更されるのを待って、別の人が説明したように、イベントリスナーを設定できます。

4

5 に答える 5

3

だから私の質問は、ブール値がtrueに変わるのを「待つ」ことはありますか?

boolean裸の変数では(効率的かつ応答的に)それを行うことはできません。/sleepテスト ループは、コストがかかるか応答しなくなるため、不適切なソリューションです。スリープ間隔が短いと CPU を浪費し、それを大きくすると、アプリケーションが状態の変化を認識するのに (比較的) 長い時間がかかります

ただしboolean、メソッド (セッターなど) を介して更新される場合は、セッターを次のようにコーディングできます。

于 2013-10-25T14:12:01.680 に答える
2

あなたは間違った方向に進んでいます。ここで行っている「ビジー待機」は、CPU 時間を不必要に消費するだけなので、ほとんどの場合間違った考えです。

私が理解していることから、UI スレッドをロックせずにボタンの押下に反応したいと考えています。その時点より前にスレッドを待機させる必要はありません。Joni が提案するように、ボタンが押されたらスレッドを開始するだけです。一度に 1 つのボタン プレスのみが処理されるようにする場合は、単一のスレッドでスレッド プールを使用できます ( SingleThreadExecutorを参照)。

また、コード例の重要な間違いを指摘したいと思いconnectingます。値が別のスレッドから変更される可能性があることをコンパイラーに伝えるために、揮発性にする必要があります。そのままでは、ワーカー スレッドが値の変更を確認する保証はないためconnecting、別のスレッドで true に設定したとしても、無限にループする可能性があります。

于 2013-10-25T14:10:41.663 に答える