在为游戏制作动画和更新计时器时,我读到与GUI有关的任何活动都应该在EDT上运行,包括重新绘制屏幕。我正在使用一个ScheduledExecutorService
来更新和绘制游戏(使用主动渲染)。最初的时间表服务(这是一个嵌套类implements Runnable
)在呼叫完成这样的:如何确保ScheduledExecutorService在EDT上运行?
ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ex.schedule(new UpdatingService(), 1, TimeUnit.MILLISECONDS);
}
});
我认为这将使在美国东部时间的服务运行,但增加System.out.println(SwingUtilities.isEventDispatchThread());
证明,这是不。
我做了一番搜索,发现this后面提到了启动EDT 里面的这个定时器。我试过这个,它确实有效。但是,像这样嵌套线程似乎不是一个好主意。
所以,嵌套这样的线程不像它看起来那么糟糕?如果这是一个坏主意,那么确保在EDT上运行ScheduledExecutorService
的正确方法是什么?
“*我做了一些搜索,发现这篇文章提到在定时器内启动EDT。*”=>这是要走的路。 – assylias
确保代码在事件派发线程上执行的最简单方法是使用[javax.swing.Timer](http://docs.oracle.com/javase/8/docs/api/javax/swing/Timer.html )(而不是java.util.Timer)而不是ScheduledExecutorService。 – VGR