簡體   English   中英

在Java中定時器ActionListener操作

[英]Timer ActionListener operation in java

我對java比較陌生,對ActionListeners的工作方式很好奇。 假設我有一個實現如下定時器的動作監聽器:

class TimerActionListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        //perform some operation
    }
}

如果將計時器設置為比我的actionlistener類中的代碼運行得更快,將會發生什么。 代碼是否完成執行並忽略新請求,直到完成(如中斷)。 或者對actionlistener的新調用優先於當前實例 - 這樣代碼永遠不會完成?

計時器的計時是在與事件派發線程(或EDT)不同的線程中完成的,事件派發線程是在ActionListener中運行代碼的線程。 因此,即使actionPerformed代碼很慢,計時器也將繼續觸發,並將其actionPerformed代碼排隊在事件隊列上,這可能會被備份,事件線程將被阻塞,應用程序將無法響應或響應不佳。

回歸點是避免調用任何在事件線程上花費一些時間的代碼,因為它會使GUI無響應。 考慮使用SwingWorker來處理這種情況。

編輯:請參閱下面的trashgod評論獲勝!

基於來自氣墊船和trashgod的帖子,似乎Timer事件不按其默認設置排隊。 (即,在計時器事件處理程序代碼執行完畢之前,將忽略新的計時器事件。)

您可以自己測試它,如下所示:

class TimerActionListener implements ActionListener {
    public static int inst = 1;
    public void actionPerformed(ActionEvent e) {
        int id = inst++;
        System.out.println("Executing instance: " + id);
        try { Thread.sleep(3000); } catch (Exception e) {} //For sleep 3 seconds
        System.out.println("Instance: " + id + "done! ");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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