1. ホーム
  2. java

[解決済み] Javaスレッドに他のスレッドの出力を待たせる方法は?

2022-06-26 11:51:04

質問

アプリケーションロジックスレッドとデータベースアクセススレッドを持つ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 パッケージとサブパッケージの中に、多くの巧妙な同時実行クラスがあります。並行処理について知るためには、本当にオンラインで資料を探すか、良い本を手に入れる必要があります。