2011-12-16 20 views
1

runメソッド内でcancel()を呼び出すと、My CheckStatus(TimerTask)が停止していません。 this.cancel()も機能しません。私は間違って何をしていますか?Java TimerTask not cancelling

import java.util.TimerTask; 
class CheckStatus extends TimerTask { 
    int s = 3; 
    public void run() { 
     if (s > 0) 
     { 
     System.out.println("checking status"); 
     s--; 
     } 
     else 
     { 
     System.out.println("cancel"); 
     cancel(); 
     } 
    } 
} 

相続人は私のドライバ

import java.util.*; 
class Game { 
    static Timer timer; 
    static CheckStatus status; 

    public static void main(String[] args) throws InterruptedException {   
     CheckStatus status = new CheckStatus(); 
     timer = new Timer(); 
     timer.scheduleAtFixedRate(status, 0, 3000); 
    } 
} 

答えて

2

それは私のために動作します - あなたが投稿正確にコードを使用して、私が見た:

checking status 
checking status 
checking status 
cancel 

...と他には何を、そのTimerTask示しますキャンセルされました。これは決して再び実行されません。

Timerは、それ以上何もする必要がなくなったときにシャットダウンすることを期待していましたか?それは自動的には行いません。あなたの大きな目標は何であるかはっきりしませんが、これを回避する1つの方法は、もTimerをキャンセルすることです。これはうまくいくでしょうが、設計上非常にうれしいわけではなく、TimerTaskがうまく動作しません他のタスクを含むタイマー

+0

タイマーが完了したらプログラムが終了することを期待していました。 – Raptrex

+0

@Raptrex:しかし、「Timer」*はまだ行われていません。まだ利用可能です。スケジュールされていないだけです。 JVMが認識している限り、別のタスクがJVMに別のタスクを追加する可能性があります。今度は、デーモンスレッドで実行できるようにすることができます( 'Timer'コンストラクタに' true'を渡します)が、あなたのタスクがキャンセルされるまでメインスレッドを生かしておく必要があります。これが大規模なプログラムの一部であると仮定すると、より多くの文脈を知らなくてもあなたに助言する方法を知るのは難しいです。 –

2

あなたはタイマータスクのキャンセルメソッドを呼び出していますが、予期した動作を得るにはタイマー自体のキャンセルメソッドを呼び出す必要があります。

+0

申し訳ありません、私はこれを行います – Raptrex

関連する問題