实现模式
生产者生产数据,消费者直接消费数据
生产者生产数据放入队列,消费者消费队列中的数据
生产者实现方案
单线程实现方案
将生产数据逻辑拆分为多个小task,task使用线程池处理。需要注意生产数据的速度和消费数据速度。
多线程实现方案
方案一
‘ProducerThreadNum’:生产者的线程数量,Thread.sleep(3000)控制生产数据的速度,确保生产数据的速度<=消费数据的速度
for (int i = 1; i <= ProducerThreadNum; i++) {
new Thread(() -> produce().start();
try {
//控制生产数据的速度
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
存在的问题:编译器出现Thread.sleep() in a loop, probably busy-waiting的提示。该写法可能造成忙等待和死锁的问题。
方案二
使用ScheduledThreadPoolExecutor 定时线程实现周期执行任务。producerCorePoolSize核心线程池数量,2表示任务执行周期。使用定时任务线程池很好的避免了出现方案一种可能出现的两个问题。
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(
producerCorePoolSize,
new ThreadFactoryBuilder().setNameFormat("producer-pool-%d").build(),
new CallerRunsPolicy());
scheduledThreadPoolExecutor.scheduleAtFixedRate(
() -> produce(), 0, 2, TimeUnit.SECONDS);
消费者实现方案
使用多线程消费数据,示例如代码:
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize,
maxPoolSize,
180,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(1024),
new ThreadFactoryBuilder().setNameFormat("consumer-pool-%d").build(),
new CallerRunsPolicy());
consumeExecutorService.submit(() -> consume())
注:个人总结。有错误之处,欢迎大佬们指证。如关于生产-消费模式有更好的实现方案,欢迎一起讨论学习。