2016-05-16 12 views
0

を終了したときに引き続き、私はこの単純なコードを持っているがutil.TimerJava.util.Timer - 私は、コードを実行すると、プロセスのメインスレッドが

public class CheckDBAccessListOpenAccesses extends TimerTask { 
    public static void main(String[] args) { 
     CheckDBAccessListOpenAccesses object = new CheckDBAccessListOpenAccesses(); 
    } 

    private CheckDBAccessListOpenAccesses() { 

     System.out.println("Start"); 
     Timer whatAccessAreOpen = new Timer(); 
     whatAccessAreOpen.scheduleAtFixedRate(this, TimeUnit.MINUTES.toMillis(1), TimeUnit.MINUTES.toMillis(1)); 
     Thread.sleep(100*60*1000); 
     System.out.println("finish"); 
    } 

    @Override 
    public void run() { 
     System.out.println("one minute"); 
    } 

} 

を使用して、プロセスは永遠に実行されます。 メインスレッドが終了したときにプロセスを停止したい。なぜタイマーはプロセスを生かし続けるのですか?それを防ぐ方法はありますか?

答えて

3

Javaには、ユーザースレッドとデーモンスレッドという2種類のスレッドがあります。ユーザスレッドはJVMの終了を防ぎますが、デーモンスレッドは終了しません。デフォルトでは、Timerはコンストラクタでデーモンとして動作するように指定されていない限り、ユーザスレッドによってサポートされます。

new Timer (true) 

は参照してください::https://docs.oracle.com/javase/8/docs/api/java/util/Timer.html#Timer-boolean-

1

これは、TimerのAPIにあります。

Timer#scheduleAtFixedRate方法:指定した時刻に始まる繰り返さ固定金利の実行のための

スケジュール指定されたタスク、。その後の実行は、ほぼ一定の間隔で、指定された期間だけ離れて行われます。

[...]

代わりに、ワンショット操作にTimer#scheduleを使用したい場合があります。

それ以外の場合は、Timerオブジェクトをメインスレッドから見ることができます。スケジュールされた操作をキャンセルする場合は、Timer#cancelを呼び出してください。あなたのメインスレッドが終了するとき。

+0

あなたはタイマー#スケジュールは同じスレッドで実行することを意味しない、答えてくれてありがとうとタイマーをインスタンス化し、生きているプロセスを維持するからタイマーを防止するために

主な機能として? –

+0

@ NoIdeaForNameようこそ。ドキュメンテーションは具体的ではありませんが、 'schedule'メソッドは起動しているスレッドと同じスレッドでは実行されません。それ以外の場合はブロックされます。これはあまり役に立ちません。あなたが望むのは、あなたの 'Timer'のインスタンスがメインスレッドで見えるようにするためです。完了したら' cancel'を呼び出すことができます。 – Mena

関連する問題