[解決済み] 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
.
スレッド間通信の方法は他にもたくさんありますが、どれを使うかは、正確には何をするかによります。
関連
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
[解決済み] Javaにデストラクタはありますか?
-
Javaでよくある構文エラー
-
Javaがテキストファイルを読み込む
-
Java基礎 - マッピングとQ/A
-
switch case文のcaseの後の列挙定数は列挙型なし
-
[解決済み] なぜJavaにはSortedListがないのですか?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
-
[解決済み】Synchronized Blockの代わりにSynchronized Methodを使用する利点はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Javaジェネリックを1つの記事で
-
セミコロン期待値エラー解決
-
CertificateException: XXXに一致するサブジェクトの代替DNS名が見つかりません 解決策
-
API の戻り値を処理するために ResponseEntity を使用する
-
コンストラクタDate()が未定義である問題
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
htmlとwordの相互変換の実装(画像あり)
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ
-
[解決済み] Javaスレッドに他のスレッドの出力を待たせる方法は?