[解決済み] Javaスレッドに他のスレッドの出力を待たせる方法は?
質問
アプリケーションロジックスレッドとデータベースアクセススレッドを持つJavaアプリケーションを作成しています。 これらの両方はアプリケーションの全生涯にわたって持続し、両方が同時に実行される必要があります (一方はサーバーに、一方はユーザーに話しかけます。アプリケーションが完全に起動すると、私は 両方 が必要です)。
しかし、起動時に、最初はアプリのスレッドが、dbスレッドの準備が整うまで待つようにする必要があります (現在はカスタムメソッドである
dbthread.isReady()
).
私は、db スレッドが準備できるまでアプリ スレッドがブロックしても気にしません。
Thread.join()
は解決策に見えません。dbスレッドはアプリのシャットダウン時にのみ終了します。
while (!dbthread.isReady()) {}
は一応動作しますが、空のループは多くのプロセッササイクルを消費します。
他のアイデアはありますか?ありがとうございます。
どのように解決するのですか?
次のようなチュートリアルをご覧になることをお勧めします。 SunのJava並行処理 のようなチュートリアルに目を通してから、マルチスレッドの魔法の世界に入ることをお勧めします。
また、多くの良い本があります(グーグルで "Concurrent Programming in Java" や "Java Concurrency in Practice"を検索してみてください。
あなたの答えにたどり着くために。
を待つ必要があるあなたのコードで
dbThread
を待つ必要があるコードでは、次のようなものが必要です。
//do some work
synchronized(objectYouNeedToLockOn){
while (!dbThread.isReady()){
objectYouNeedToLockOn.wait();
}
}
//continue with work after dbThread is ready
あなたの
dbThread
のメソッドでは、次のようなことをする必要があります。
//do db work
synchronized(objectYouNeedToLockOn){
//set ready flag to true (so isReady returns true)
ready = true;
objectYouNeedToLockOn.notifyAll();
}
//end thread run method here
は
objectYouNeedToLockOn
これらの例で使っているのは、各スレッドから同時に操作する必要のあるオブジェクトであることが望ましいのですが、別に
Object
を作成することもできます(メソッド自体を同期させることはお勧めしません)。
private final Object lock = new Object();
//now use lock in your synchronized blocks
理解を深めるために
上記を行うには、他の(時にはより良い)方法があります。
CountdownLatches
などです。Java 5以降では、多くの気の利いた並行処理クラスが
java.util.concurrent
パッケージとサブパッケージの中に、多くの巧妙な同時実行クラスがあります。並行処理について知るためには、本当にオンラインで資料を探すか、良い本を手に入れる必要があります。
関連
-
[解決済み] 他のスレッドからGUIを更新するにはどうすればよいですか?
-
eclipse で「アクセス制限: タイプ 'HttpServer' は API ではありません」というプロンプトが表示される。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Javaで配列に特定の値が含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Javaにおける "implements Runnable "と "extends Thread "の違いについて
最新
-
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.util.NoSuchElementException
-
java.util.NoSuchElementException 原因解析と解決方法
-
Java Error スレッド "AWT-EventQueue-0" で例外発生 java.lang.
-
Java のエラーです。未解決のコンパイル問題 解決方法
-
SpringBootApplication を型解決できない。
-
Eclipseでプロジェクトエクスプローラービューとパッケージエクスプローラービューを使う
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
Google Chromeのエラー「Not allowed to load local resource」の解決策について
-
[解決済み] C#のasync/awaitに相当するJava?