【问题标题】:Creating a visualization for a multi-threaded application in Java Swing在 Java Swing 中为多线程应用程序创建可视化
【发布时间】:2016-01-11 22:57:41
【问题描述】:

我一次又一次地遇到了 Swing 一直遇到的问题。 Swing 不适合程序员处理自己的异步操作。

现在摆在我面前的是一个典型的问题,它经常被诸如“让 Swing 的 EDT 处理异步任务”或“稍后使用调用”之类的答案所困扰。

通常情况下,如果我从头开始构建整个应用程序,这就是我要走的路。然而,我不是。我目前拥有的是一个程序(我不应该以任何方式修改),它在自己的线程中运行并触发自己设计的异步更新事件。我想使用 Swing 为其制作 UI 包装器,在面板中显示应用程序,同时提供与底层程序交互的按钮。

现在,我真的不想因此而掉头发。我不会一次几个小时地正面解决这个问题而没有进展。如果对这个问题没有可接受的答案,我将简单地使用 OpenGL 包装器(这是正确的“简单”)。


问题

  • 在 Java Swing 中是否有包装这种性质的多线程应用程序的常规方法?

  • 该方法是否允许被动查看不断变化的模型? (没有 UI 鼠标或键盘事件,但仍会更新)

  • 如果没有常规方法,是否有针对我正在尝试做的事情的 hack、bodge 或其他管道胶带解决方案?


未能识别应用程序的异步部分在另一个程序中并建议修改该程序的答案将被视为非建设性的,并将被标记为离题。

如果您需要更多信息,请发表评论,我会尽可能多地披露。

【问题讨论】:

  • “在 Java Swing 中是否有包装这种性质的多线程应用程序的常规方法?” - SwingWorkerSwingUtilties.invokeLater 想到了
  • “该方法是否允许被动查看变化的模型?(没有 UI 鼠标或键盘事件,但仍会更新)”- 是的,SwingWorkerSwingUtilities.invokeLater 将关心用户与模型的交互,他们将(如果您设计这样做)只关心您的其他程序正在生成的事件。还需要仔细考虑将更新发送回您的程序,因为您不想在执行此操作时阻止 EDT(没有上下文,所以假设),但是因为其他程序似乎是事件驱动的,所以您的“观察者”应该可以应付
  • @MadProgrammer SwingUtilities.invokeLater(...) 必须从产生框架的线程中调用,不是吗?
  • @MadProgrammer 我所说的被动查看的意思是,如果我查看 UI 并且模型会自我更新,那么 UI 会发生变化吗?根据您对我之前评论的回复,我已经有了答案。我不知道如果可以的话,可以从其他线程调用 invokeLater。
  • 这将归结为EventQueue,因为RunnableinvokeLater 弹出到队列中

标签: java multithreading swing asynchronous


【解决方案1】:

为此使用SwingWorker。在doInBackground() 的实现中启动该过程。为工作人员提供对将从进程接收“异步更新事件”的侦听器的引用。在侦听器中,根据需要调用publish() 以允许“被动查看变化的模型”。 process() 的实现将在 EDT 上的 sustainable rate 处调用。可以看到几个例子here

【讨论】:

  • 我将进一步研究这个解决方案。它看起来是两者中的佼佼者(制作工人与制作零星的 invokeLater 调用)。
  • SwingWorker 极大地简化了对共享数据的同步访问。能否详细说明一下“异步更新事件”是如何产生的?
  • Observer/Observable 风格的异步寓言,其中 Observer 为每个观察者创建一个通知线程。
  • 听起来你的doInBackground() 可以启动进程,在isCancelled() 上循环休眠,最后终止进程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
相关资源
最近更新 更多