Java多线程和SWING

Java多线程和SWING,java,multithreading,swing,Java,Multithreading,Swing,我正在开发一个基于SWING的多线程Java应用程序 其思想是创建一组后台“任务/服务”,以重复执行某些任务 我的问题是如何实现多线程(在应用程序的较低级别),在某些情况下通过显示SWING组件与GUI交互 我知道我可以使用SwingWorker,但使用它,我将使我的应用程序更加“面向gui”,我不想这样做,但另一方面,我也不想让我的多线程类依赖于gui类 在哪里有什么选择 先谢谢你 编辑 我忘了提到这个后台任务需要在一开始就启动,不能由GUI启动(就像引导过程) 但另一方面,我也不想让我的多线

我正在开发一个基于SWING的多线程Java应用程序

其思想是创建一组后台“任务/服务”,以重复执行某些任务

我的问题是如何实现多线程(在应用程序的较低级别),在某些情况下通过显示SWING组件与GUI交互

我知道我可以使用SwingWorker,但使用它,我将使我的应用程序更加“面向gui”,我不想这样做,但另一方面,我也不想让我的多线程类依赖于gui类

在哪里有什么选择

先谢谢你

编辑


我忘了提到这个后台任务需要在一开始就启动,不能由GUI启动(就像引导过程)

但另一方面,我也不想让我的多线程 类依赖于GUI类

使用观察者/监听器模式怎么样?由SwingWorker启动的后台任务可以在需要时通知其他组件@Xeon comment为您指明了一个好的方向

个人建议:从一些解决方案开始,然后在代码变得不那么可读时继续重构


顺便说一句,我希望您记住旧规则:
Swing组件只能在事件分派线程上访问

您需要了解并发设计模式,如参与者、未来、线程池等。事件驱动意味着您没有阻塞代码,例如,我不是在等待您并不断询问您是否完成了任务,而是在准备好后告诉我

如果您选择actor路线,您可以将gui类包装在一个控制器中,该控制器是一个一次处理一条消息的actor。您需要小心swing,不要创建事件循环,如事件A触发事件B,后者再次触发事件A等等

这就是为什么观察者模式可以很好地显示数据

但是,对于并发性来说,没有什么灵丹妙药。不幸的是,演员模型正在进步,未来也在进步(看看akka),但这本质上是一项艰巨的任务,因此总是很难做到正确


从本质上说,最简单的方法是对您愿意接受的并发类型制定非常严格的规则,您需要考虑添加每一点并行功能的后果,以及它会产生什么影响。然后使用一个完善的并发模型在此基础上设计代码。

您想要做的是大多数设计人员想要做的标准方式,即拥有一个独立于GUI的后台工作类


标准方法是创建一个类MyWingWorker,它扩展SwingWorker并调用您的后台类。根据应用程序的复杂性,您可能需要创建一个或多个对话类来包装您对MyWingWorkers的使用。

使您的核心“多线程代码库”独立于SwingWorker,只需在SwingWorker中使用此代码库即可-我指的是独立关注点,并在SwingWorker和“多线程代码库”。也许你甚至可以创建事件驱动/面向总线的设计。@Xeon可以详细说明你的答案吗?你所说的代码库和“事件驱动/面向总线的设计”是什么意思?你能举个例子(链接或其他东西)吗关于你的建议?@nervousDev你可以看看GWT EventBus是如何工作的。概念完全相同。我做了一个快速搜索,是的,这可能是我需要的。这是事件总线设计的唯一选项吗?我忘了在一开始就需要启动此后台任务(我将编辑问题,请参见那里)@nervousDev这不是问题。但是你的应用程序可以对来自后台任务的事件做出反应。谢谢你的解释。我知道设计模式,但不太适用于多线程应用程序。我使用分层设计(GUI、控制器、模型等)。这就是为什么我不希望像多线程类这样重要且相关的类依赖于其他类的原因。不用担心,我也要提到,现在已经没有多少人在Swing中制作桌面应用程序,甚至更少的人在制作多线程桌面应用程序,这将是一项非常困难的任务。祝你好运。我制作了一个桌面应用程序为一个使用akka的多线程项目顶级构建服务器和客户端。它可以让你控制在任何给定时间可以进行多少签出和构建,虽然需要2周,但需要2个月lol。但它非常棒。我知道Swing并不是一个真正的现代方法,它正在被淘汰,但现在它是唯一的gui framework我可以用。也许有一天它会被改变。多线程我不会和你说的一样。它可能不再像以前那样有用了,但它仍然是一个很好的“特性”“因为你可以做一些你本来做不到的事情。非常感谢。当我添加到问题中时,后台任务需要在开始时一直运行,这样GUI(SwingWorker)就不能这样做。在后台进行一次操作并非如此。谢谢。实际上,SwingWorker可以通过它的publish()方法来适应这一点,但是在后台方法和包含SwingWorker的类之间需要一个接口类,然后需要找到一个同步它们的方法(何时调用publish())。在这里可以看到更多:对于快速搜索中可以看到的内容,我想我会选择eventbus设计选项。只是因为我真的不喜欢“从GUI”编写代码,即使是分层。无论如何谢谢你。我会检查你的链接。你不会“从GUI编码”,你会从包含各种组件(包括GUI)的应用程序编码-但EventBus是一种很好的方式。谢谢。两种方法我都试试。我要做一个测试申请,然后