4

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 オブジェクトが終了し、プロセスが終了するはずだと思います。

ここで何が起こったのですか?

4

3 に答える 3

2

タイマーを実行しているスレッドがまだ起動しているため、Java は終了していません。Java が終了する前に、そのスレッドをデーモン スレッドとしてマークする必要があります。おそらく、スレッド自体にアクセスすることはできないため、タイマーにマークするメソッドがない限り、それを行うのに苦労するでしょう。finally 句で手動で停止する必要があります。

try {
   timer = new Timer();
   timer.schedule( new SysPrint(), 200 );
} finally {
   timer.cancel();
}
于 2010-08-17T03:12:34.580 に答える