java - 如何在 Java 中创建 "event-driven"后台线程?

标签 java worker event-driven-design invokelater

我喜欢 invokeLater() 将工作单元发送到 AWT EDT 的简单性。有一个类似的机制将工作请求发送到后台线程(例如 SwingWorker)会很好,但据我了解,这些没有任何类型的事件排队和调度机制,而这正是 invokeLater() 所依赖的。

因此,我最终为我的后台线程提供了一个阻塞队列,其他线程向该队列发送消息,并且该线程本质上运行一个接收循环,阻塞直到消息到达。

事实上,这可能正是人们在后台线程中实现类似 EDT 行为的方式(或者会吗?)。另一方面,我喜欢线程的简单性,它只是惰性地悬卡在那里,每当它们恰好从空中某个看不见的事件调度队列调度到它时处理“工作滴”。 Java 是否提供了创建这种“事件驱动的工作线程”的方法?还是消息队列毕竟是执行此操作的正确方法?与此相关,invokeLater() 消息传递技术是否存在缺陷?

最佳答案

Producer-Consumer Design Patter (这就是您在阻塞队列中使用的)只是解决不同类别问题的不同方法;美国东部时间采用 Worker Design Pattern .查看这两种设计模式,看看哪一种最适合您的需求。

  • 当您有多个线程分别执行独立任务时,通常会使用生产者-消费者模式。
  • EDT 采用的 Worker 模式用于将多个任务的结果汇集到单个线程(在本例中为 GUI 线程)。

当然,如果您有一个队列和一个具有多个生产者的消费者,您可以采用生产者-消费者模式并实现与 Worker 模式类似的行为,但这恰恰突出了设计模式的灵 active 。因此,再次强调,选择设计模式是基于最适合您的特定情况的设计模式 - 当模式足够灵活以适应您想要的行为时,没有特别错误的选择。

关于java - 如何在 Java 中创建 "event-driven"后台线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7044699/

相关文章:

node.js - 如何草拟一个事件驱动系统?

java - 类内集合的自定义 setter/getter ?

java - 关于我的代码的类型错误的非法开始

go - 与 channel 一起进入候车室( worker )

multithreading - 什么是Odoo中的 "worker"?

java - ZeroMQ,我们可以使用 inproc : transport along with pub/sub messaging pattern

java - 在mysql中执行过程时通信链接失败

java - Eclipse:如何以编程方式打开编辑器

c# - System.Timers.Timer在Azure辅助角色中徘徊