【发布时间】:2014-05-12 03:01:47
【问题描述】:
在为游戏制作动画和更新计时器时,我了解到任何与 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()); 证明事实并非如此。
我进行了一些搜索,发现 this 帖子中提到了在 inside 计时器中启动 EDT。我试过了,它确实有效。但是,像这样嵌套线程似乎不是一个好主意。
那么,像这样嵌套线程并没有看起来那么糟糕吗?如果这是一个坏主意,那么确保 ScheduledExecutorService 在 EDT 上运行的正确方法是什么?
【问题讨论】:
-
"我做了一些搜索,发现这篇文章提到在计时器内启动 EDT。" => 这就是要走的路。
-
确保代码在事件调度线程上执行的最简单方法是使用javax.swing.Timer(不是 java.util.Timer)而不是 ScheduledExecutorService。
标签: java swing thread-safety