java-如何保证ScheduledExecutorService在EDT上运行?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-如何保证ScheduledExecutorService在EDT上运行?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1630字,纯文字阅读大概需要3分钟。
内容图文
在研究游戏的动画和更新计时器时,我读到任何与GUI有关的活动都应在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.我试过了,它确实起作用.但是,嵌套这样的线程似乎不是一个好主意.
那么,这样的嵌套线程是否看起来不那么糟糕?而且,如果这是一个坏主意,那么确保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上运行?全部内容,希望文章能够帮你解决java-如何保证ScheduledExecutorService在EDT上运行?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。