我有多个 生产环境 者和单个消费者的阻塞队列(足以进行项目的后期处理) .
生产环境 者按计划开始,将任务发送到执行程序池,然后由工作人员将任务添加到队列中 .
关于如何启动消费者线程的问题?
现在我有@EventListener(SpringBoot),它发送启动到singleThreadExecutorPool方法,该方法在无限循环中为队列服务,对于这种情况可能存在更好的解决方案 . 看起来像消耗队列的常见模式 .
你的方法非常好 . 这是我个人用于此类案件的模式 .
@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(); } } }
1 回答
你的方法非常好 . 这是我个人用于此类案件的模式 .