簡體   English   中英

如何保證在EDT上運行ScheduledExecutorService?

[英]How does one guarantee that an ScheduledExecutorService is running on the EDT?

在處理動畫和更新游戲計時器時,我讀到任何與GUI相關的活動都應該在EDT上運行,包括重新繪制屏幕。 我使用單個ScheduledExecutorService來更新和繪制游戲(使用活動渲染)。 服務的初始調度( implements Runnable的嵌套類)是在這樣的調用中完成的:

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            ex.schedule(new UpdatingService(), 1, TimeUnit.MILLISECONDS);
        }
    });

我認為這會使服務在EDT上運行但添加System.out.println(SwingUtilities.isEventDispatchThread()); 證明事實並非如此。

我做了一些搜索,發現這篇帖子提到在計時器啟動EDT。 我嘗試了這個,它確實有效。 但是,像這樣嵌套線程似乎不是一個好主意。

那么,像這樣嵌套線程並不像看起來那么糟糕嗎? 如果這是一個壞主意,那么確保在EDT上運行ScheduledExecutorService的正確方法是什么?

在你的代碼中:

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            ex.schedule(new UpdatingService(), 1, TimeUnit.MILLISECONDS);
        }
    });

這里在EDT上執行的唯一代碼是ex.schedule調用。 稍后由調度程序調用的代碼,例如new UpdatingService()將在調度程序內部的線程上運行,該線程不是EDT,而是由Executors.newSingleThreadScheduledExecutor調用創建的某個線程。

也許我要做的是讓你的調度程序安排一個更新方法(也許你的更新服務),然后它本身通過invokeLater將一個調用放到EDT上。

例如,像:

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
ex.schedule(new Updater(), 1, TimeUnit.MILLISECONDS);
...
class Updater extends Runnable {
    @Override
    public void run() {
      // invoke the EDT via Swing Utilities here.     
    }
}

這是我最好的建議,而不會看到你的其余代碼在做什么。

暫無
暫無

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

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