如何在Java中创建“事件驱动的”后台线程?

时间:2011-08-12 18:31:41

标签: java worker event-driven-design invokelater

我喜欢invokeLater()的简单性,用于向AWT EDT发送工作单元。有一个类似的机制可以将工作请求发送到后台线程(例如SwingWorker),但据我所知,它们没有任何类型的事件排队&调度机制,这是invokeLater()所依赖的。

所以相反,我最终给了我的后台线程一个阻塞队列,其他线程向其发送消息,并且该线程基本上运行一个接收循环,阻塞直到消息到达。

事实上,这可能正是人们如何在后台线程中实现类似EDT的行为(或者它会是什么?)。另一方面,我喜欢简单地悬挂在那里的线程的简单性,只要碰巧从天空中的一些看不见的事件调度队列发送到它就处理“工作水滴”。 Java是否提供了创建这种“事件驱动的工作线程”的方法?或者是消息排队正确的方法来执行此操作吗?并且在相关的情况下,消息传递的invokeLater()技术是否存在缺陷?

2 个答案:

答案 0 :(得分:3)

Producer-Consumer Design Patter(你正在使用你的阻塞队列)只是解决不同类问题的另一种方法; EDT使用Worker Design Pattern。看看这两种设计模式,看看哪种模式最适合您的需求。

  • 当您有多个线程分别执行独立任务时,通常会使用Producer-Consumer模式。
  • EDT使用的Worker模式用于将多个任务的结果汇总到一个线程中(在本例中为GUI线程)。

当然,如果您有一个队列和一个具有多个生产者的消费者,您可以采用Producer-Consumer模式并实现与Worker模式类似的行为,但这只是突出了设计模式的灵活性。因此,重点是,选择一种设计模式是基于最适合您特定情况的设计模式 - 当模式足够灵活以适应您所希望的行为时,没有特别错误的选择。

答案 1 :(得分:1)

你应该看看java.util.concurrent,更具体地说是Executor的,它通常只是一个可以处理这样的请求的线程池:executor.execute(runnableTask);。如果您希望单个线程处理所有请求,则使用单个线程创建您的线程:executor = Executors.newSingleThreadExecutor()'。还有ExecutorService,它可以在任务完成时返回一个值。