关于Java中的调度的良好实践

时间:2018-05-01 23:16:18

标签: java scheduling

我只使用标准库从头开始构建游戏。到目前为止,我已经有了一个游戏,它在一个摆动窗口中打印ASCII字符来表示3d对象。这很酷。无论如何,由于我不了解线程或安排,我想知道我是否使用了一些可能导致问题的不良做法。我有一个重复的任务运行,每十分之一秒更新一次,但每当我想延迟一些事情时,我都会使用

Executors.newScheduledThreadPool(1).schedule... etc etc.

制作一个新的预定线程池"是否合适?每次我想要一个新的延迟任务运行一次,或者我应该尝试保持一个实例运行?如果重用实例很好,那么何时制作新实例呢?

1 个答案:

答案 0 :(得分:0)

Swing应用程序中的并发很棘手:影响GUI的所有内容都需要在单个线程上执行(称为事件派发线程)。因此,当您设置一个单独的线程来执行一些长时间运行的后台任务时(例如,为玩家尚未查看的区域生成地图),您需要仔细地工作以与可能影响GUI的任何内容同步。

通常,对于更简单的用例,您有两种选择:

  • 如果它是一个立即影响GUI的短活动,则使用Timer在事件派发线程上触发事件。见here
  • 如果它是一项长期活动,请使用SwingWorker。见here

还有很多其他方法可以实现与其他线程的交互(例如,请参阅SwingUtilities.invokeLaterSwingUtilities.invokeAndWait),但鉴于您已经说过刚刚开始,我会建议您坚持使用其中一个现在。它们为您处理大部分复杂性,让您专注于您的游戏逻辑。