簡體   English   中英

帶有線程的Java Timer

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM