Thread.isAlive() は TERMINATED で 「生存していない」
Thread.isAlive() は 実際にThread が GC されてからでないと
Falseにならないと思ってました。
でも、次の処理がない場合は 「生存していない」扱いになることを発見。
知らなかった。。。
以下検証コードです。
public class Test{ public static void main(String[] args) { new TestChiledThread(Thread.currentThread()).start(); try { Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(TestChiledThread.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("main end."); System.gc(); } @Override protected void finalize() throws Throwable { System.out.println("finalize!"); super.finalize(); } } class TestChiledThread extends Thread{ private Thread current = null; public TestChiledThread(Thread current){ this.current = current; } @Override public void run(){ for(int i = 0 ; i < 5 ; i++){ try { System.out.println( "status:" + current.getState() + " isAlive:" + current.isAlive() + " instance-null?:" + (current == null)); Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(TestChiledThread.class.getName()).log(Level.SEVERE, null, ex); } } } }
結果こうなりました
run: status:TIMED_WAITING isAlive:true instance-null?:false main end. status:RUNNABLE isAlive:true instance-null?:false status:TERMINATED isAlive:false instance-null?:false status:TERMINATED isAlive:false instance-null?:false status:TERMINATED isAlive:false instance-null?:false ビルド成功(合計時間: 5秒)