5

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

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

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

4

2 回答 2

3

生产者-消费者设计模式(这是您在阻塞队列中使用的)只是解决不同类别问题的不同方法;EDT 采用工人设计模式。看看这两种设计模式,看看哪一种最适合您的需求。

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

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

于 2011-08-12T18:40:03.930 回答
1

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

于 2011-08-12T18:38:29.677 回答