私のメインプログラムでは、1つのユーザースレッドを実行しており、そのすべての子はデーモンスレッドです。このため、ユーザースレッドが動作を終了すると、すべてのデーモンスレッドも終了します。デーモンスレッドでいくつかのコードブロックを実行していますが、スレッドを終了する前に終了する必要があります。
ユーザースレッドが動作を終了した場合、デーモンスレッドで特定のブロックの実行を待つことは可能ですか?
私のメインプログラムでは、1つのユーザースレッドを実行しており、そのすべての子はデーモンスレッドです。このため、ユーザースレッドが動作を終了すると、すべてのデーモンスレッドも終了します。デーモンスレッドでいくつかのコードブロックを実行していますが、スレッドを終了する前に終了する必要があります。
ユーザースレッドが動作を終了した場合、デーモンスレッドで特定のブロックの実行を待つことは可能ですか?
このさまざまな方法を実装できます
まず、実行を終了するためにスレッドによって実行されるコードブロックが本当に必要な場合、そのスレッドは実際にはデーモンスレッドではありません。
ただし、要求したことを実行するために、 Thread#join()を介してメインスレッドにデーモンスレッドを待機させることができます。
CountDownLatchまたはCyclicBarrierを見たことがありますか?
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html
私はそれがあなたが実際にやりたいことによると思います:
シャットダウンする前に実行する、かなり独立したコードブロックがあります。解決策:フックをシャットダウンします
Runtime.getRuntime()。addShutdownHook(new Thread(){public void run(){database.close();}});
スレッドを正常にシャットダウンする必要があります。解決策:ユーザースレッドを使用します。それらを停止するためにそれらを中断します。名前付きソリューションの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