ここには3つのオプションがあります。最も簡単なのは、スレッドをデーモンとして作成することです。つまり、メインプログラムが終了すると、すべてのデーモンスレッドも終了します。
Thread thread = new Thread();
thread.setDaemon(true);
これは最も簡単ですが、欠点は、正常にシャットダウンされないことです(つまり、スレッドが停止し、リソース管理などを実行する機会が得られないため、問題になる場合と問題がない場合があります)。
別の方法は、生成されたスレッドを保持し、プログラムが閉じるためのシグナルを受信したら、スレッドを繰り返し処理し、スレッドも終了する必要があることを示す何らかのシグナルを渡すことです。
volatile boolean shutdown = false;
public void shutdown() {
shutdown = true;
}
public void run() {
while(!shutdown) {
... do your work here
}
... perform any cleanup work here
(注:わかりやすくするために、例外処理は無視されます)
最後のオプションは、java.util.concurrentのExecutorフレームワークを使用することです。
ExecutorService executorService = Executors.newFixedThreadPool(10);
... assign/invoke tasks etc
... at some point later your program is told to shutdown
... shutdown in executor too
executorService.shutdown();
executorService.awaitTermination(10, TimeUnit.SECONDS); // wait for 10s in this case
executorService.shutdownNow();