首页 文章

Java - 单线程执行程序

提问于
浏览
1

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

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

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

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

1 回答

  • 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();
        }
      }
    }
    

相关问题