2016-05-16 35 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"); 
    } 

} 

這個簡單的代碼過程中不斷的過程將永遠運行下去。 我希望進程在主線程結束時停止。爲什麼Timer保持進程活着?有沒有辦法阻止它?

回答

3

Java有兩種類型的線程:用戶線程和守護進程線程。用戶線程阻止JVM終止,守護線程不會。默認情況下,定時器由用戶線程支持,除非它指定在構造函數中作爲守護程序運行。

爲了防止計時器從飼養過程活着,用實例定時器:

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