gpt4 book ai didi

java - 如何保证 ScheduledExecutorService 正在 EDT 上运行?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:14:00 28 4
gpt4 key购买 nike

在为游戏制作动画和更新计时器时,我读到任何与 GUI 相关的 Activity 都应该在 EDT 上运行,包括重新绘制屏幕。我正在使用单个 ScheduledExecutorService 来更新和绘制游戏(使用主动渲染)。服务的初始计划(这是一个嵌套类,实现 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帖子提到在计时器内部启动 EDT。我试过了,它确实有效。但是,像这样嵌套线程似乎不是一个好主意。

那么,像这样嵌套 Threads 并没有看起来那么糟糕吗?如果这是个坏主意,那么确保 ScheduledExecutorService 在 EDT 上运行的正确方法是什么?

最佳答案

在您的代码中:

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.
}
}

这是我最好的建议,没有看到你的代码的其余部分在做什么。

关于java - 如何保证 ScheduledExecutorService 正在 EDT 上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23596620/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com