Java - 单线程执行程序

时间:2017-10-31 09:21:06

标签: java spring multithreading architecture blockingqueue

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

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

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

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

1 个答案:

答案 0 :(得分: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();
    }
  }
}