[英]Java Timer with thread
我開發了一個簡單的應用程序,並使用了計時器,但是如果我多次運行計時器,計時器將丟棄此異常:線程“ AWT-EventQueue-0”中的異常java.lang.IllegalStateException:計時器已取消。 這是我的代碼:
public class Main {
...
private static void createAndShowUI() {
...
//a listener of a radio button
ActionListener on_action = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Timer.timer.schedule(Timer.task,0,2000); //I call the timer here
}
};
...
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
//and the class of timer:
public class Timer {
public static java.util.Timer timer = new java.util.Timer();
public static java.util.TimerTask task = new java.util.TimerTask() {
public void run() {
//some tasks
}
};
}
我的問題是,我在哪里使用線程? 謝謝!
問題不在於使用事件隊列線程,而是您正在重新使用已取消的計時器。
我猜想您正在使用計時器來做一些動畫或響應按鈕按下的操作(因為您以固定的速度安排事物)。 我也在猜測,在代碼中您不向我們展示,計時器會被一個單獨的事件取消。 如果您曾經調用過Timer.cancel(),可以向我們展示該代碼嗎?
從例外情況來看,您正在嘗試使用已經取消的計時器。 一旦取消計時器,將無法再次使用它。
兩個建議-每次使用不同的計時器。 此外,如果您出於UI目的而做事,則可能要考慮使用Swing計時器 。
就線程而言,所有GUI事件都在AWT線程上發生,但是我重復一遍,這幾乎肯定不是問題。 閱讀此以獲得更多詳細信息。
如果已調用cancel()
方法或計時器任務意外終止,則計時器將進入取消狀態:
如果計時器的任務執行線程意外終止,例如,由於調用了它的stop方法,則在計時器上計划任務的任何進一步嘗試都將導致IllegalStateException,就好像計時器的cancel方法已被調用一樣。
所以你的情況,它可能不是你把/電話/使用時間的問題,但你實際上你的計時器做什么更多的問題。
這是線程:
與每個Timer對象相對應的是一個后台線程,該線程用於依次執行所有Timer的任務
因此,如果您嘗試從Timer任務訪問GUI,則應將其放入EventQueue線程中。
看看這里
如果計時器的任務執行線程意外終止,例如,由於調用了它的stop方法,則在計時器上計划任務的任何進一步嘗試都將導致IllegalStateException,就好像計時器的cancel方法已被調用一樣。
取消計時器后,是否讓計時器安排其他任務?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.