Java の Timer クラスの動作について質問があります。これはコードです: http://pastebin.com/mqcL9b1n
public class Main {
public static void main(String[] args) {
Main m = new Main();
m.foo();
m = null;
}
public void foo() {
Timer t = new Timer();
t.schedule(new SysPrint(), 200);
}
}
class SysPrint extends TimerTask {
public void run() {
System.out.println("Yes!");
}
}
そのプログラムを実行すると、「Yes!」と出力されます。他には何もしません (プログラムは終了しません)。
Java のドキュメントには次のように書かれています: Timer オブジェクトへの最後のライブ参照がなくなり、すべての未処理のタスクの実行が完了すると、タイマーのタスク実行スレッドは正常に終了します (そしてガベージ コレクションの対象になります)。
このことを見ると、「foo()」関数が終了した後、Timer オブジェクトへの「最後のライブ参照」がなくなっています。スケジュールされた唯一のタスクは「Yes!」でした。実行されたタスクなので、プロセスが「Yes!」を出力した後、Timer オブジェクトが終了し、プロセスが終了するはずだと思います。
ここで何が起こったのですか?