【问题标题】:Java - Single thread executorJava - 单线程执行器
【发布时间】:2018-04-12 09:50:54
【问题描述】:

我有多个生产者和单个消费者的阻塞队列(这足以对项目进行后期处理)。

生产者按计划开始,将任务发送到执行器池,然后由工作人员将任务添加到队列中。

关于如何启动消费者线程的问题?

现在我有 @EventListener (SpringBoot),它在启动时发送到 singleThreadExecutorPool 方法,该方法在无限循环中为队列提供服务,对于这种情况,也许存在更好的解决方案。看起来很常见的消费队列模式。

【问题讨论】:

  • 为什么不直接让你的生产者直接喂给消费者执行者呢?
  • 我有多个消费者来平滑波动很大的 IO 和网络服务延迟。对我来说,管理一个消费者比管理几个消费者容易得多。但是,是的,我认为您的方法也可能很好,您的意思是在获得结果后生产者等待(一个)消费者会接受它?我考虑了一下,但决定队列,因为我可以根据队列的实现实现一些逻辑(和统计监控)(是的,也许不是最好的方法,这就是我在这里提问的原因:D)
  • 或者你的意思是在消费者中实现内部队列?
  • 检查这篇文章是否有用:stackoverflow.com/questions/2332537/…

标签: java spring multithreading architecture blockingqueue


【解决方案1】:

您的方法非常好。 这是我对此类情况的个人模式。

@Component
public class ConsumerTask implements Runnable {

  private ExecutorService executorService;
  private BlockingQueue<Object> queue;

  // use dependency injection if needed
  public ConsumerTask(BlockingQueue<Object> queue) {
    executorService = Executors.newSingleThreadExecutor();
    this.queue = queue;
  }

  @PostConstruct
  public void init() {
    executorService.execute(this);
  }

  @PreDestroy
  public void destroy() {
    // unlike shutdown() shutdownNow() sends interruption to running tasks
    executorService.shutdownNow();
  }

  @Override
  public void run() {
    try {
      while (true) {
        Object o = queue.take();
        // process o
      }
    } catch (InterruptedException e) {
      // we were interrupted by shutdownNow(), restore interrupted status and exit
      Thread.currentThread().interrupt();
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-27
    • 2017-12-29
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2011-04-14
    相关资源
    最近更新 更多