1

私のメインプログラムでは、1つのユーザースレッドを実行しており、そのすべての子はデーモンスレッドです。このため、ユーザースレッドが動作を終了すると、すべてのデーモンスレッドも終了します。デーモンスレッドでいくつかのコードブロックを実行していますが、スレッドを終了する前に終了する必要があります。

ユーザースレッドが動作を終了した場合、デーモンスレッドで特定のブロックの実行を待つことは可能ですか?

4

4 に答える 4

2

このさまざまな方法を実装できます

  1. Thread.join();を使用する
  2. Observer-Observableパターンの使用
  3. CountDownLatchの使用
于 2012-08-17T18:45:27.190 に答える
1

まず、実行を終了するためにスレッドによって実行されるコードブロックが本当に必要な場合、そのスレッドは実際にはデーモンスレッドではありません。

ただし、要求したことを実行するために、 Thread#join()を介してメインスレッドにデーモンスレッドを待機させることができます。

于 2012-08-17T18:37:22.440 に答える
1

CountDownLatchまたはCyclicBarrierを見たことがありますか?

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

于 2012-08-17T18:39:13.347 に答える
1

私はそれがあなたが実際にやりたいことによると思います:

  1. クリティカルセクション内にあるときにデーモンスレッドがシャットダウンされるのを避けたいと考えています。解決策:このセクションにいる間、デーモンスレッドは読み取りロックを取得し、ユーザースレッドは終了する前に書き込みロックを取得する必要があります。
  2. シャットダウンする前に実行する、かなり独立したコードブロックがあります。解決策:フックをシャットダウンします

    Runtime.getRuntime()。addShutdownHook(new Thread(){public void run(){database.close();}});

  3. スレッドを正常にシャットダウンする必要があります。解決策:ユーザースレッドを使用します。それらを停止するためにそれらを中断します。名前付きソリューションの1つを使用して待機します。

箇条書き1の詳細:

これはReadWriteLockに基づいています。

// Demon
Lock l = readWriteLock.getReadLock(); 
l.lock(); // Will wait here if WriteLock is requested
try {
    // access the resource protected by this lock
} finally {
    l.unlock();
}


// User
Lock l = readWriteLock.getWriteLock(); 
l.lock(); // Will wait here until all readLock are unlocked
// no need to unlock. Dys anyway
于 2012-08-17T19:01:01.500 に答える