![](/img/trans.png)
[英]Does ScheduledExecutorService guarantee order when pool size is one?
[英]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.