现在是这样的
1.首先我最外面有个 quartz 定时器,每隔 N 秒执行一次
2.定时器里执行的内容是这样,里面有个线程池,线程池大小是 2 个线程,coresize,maxsize 都是 2
3.线程池里的 2 个线程,分别一个去执行生产者方法,一个去执行消费者方法
4.生产者和消费者中间用消息队列来临时存数据
现在有个问题,就是消费者这边,怎么能保证取到数据,又能正确的退出线程,进行到下一次定时器的执行
在这之前我做的蠢办法是消费者那边加了个 while(true),结果定时器执行了 2 次后,线程池就满了,然后拒绝
所以不知道有啥好办法
代码:
//线程池的
public class TestTask extends QuartzJobBean {
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
2,
2,
60,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(4));
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) {
threadPoolExecutor.execute(() -> {
//生产者代码
//数据放入消息队列
});
threadPoolExecutor.execute(() -> {
while (true) {
//取队列里的数据
//消费者代码
}
});
}
}