私はいくつかの行動を理解しようとしています。1 つのスレッドを生成するコードがいくつかあります。しばらく待ってから中断し、参加してからメソッドを終了します。
.
.
.
try {
Thread.sleep(processForMillis);
}
catch (InterruptedException ex) {
// Won't happen, ignore.
}
for (Thread t : threads) {
logger.debug("Interrupting Thread " + t.getName());
t.interrupt();
}
for (Thread t : threads) {
try {
t.join(1000L);
logger.debug("Joined Thread " + t.getName());
logger.debug("isAlive? " + t.isAlive());
}
catch (InterruptedException ex) {
// this will never happen
logger.debug("InterruptionException while joining, but didn't expect it.");
}
}
} // end of method
現在、これを 1 つのスレッドで実行しています。通常、参加後に isAlive() が false になることをログで確認できますが、まだ生きている場合もあります。スレッドは while ループに入っています:
while(!Thread.currentThread().isInterrupted()){
.
// do some blocking io stuff here
}
したがって、スレッドが入力ストリームの読み取り/処理中にスレッドを中断し (io をブロック)、while 条件を押して結合を終了するのにかかる時間よりも多くの時間がかかっていると思われます。
私の質問は、スレッドはどうなりますか?
スレッドは参照されなくなり、スレッドをガベージ コレクションできますが、どのリソースも適切にクリーンアップされておらず、問題があるようです。NIO に切り替える以外に、これに適したパターンはありますか?