线程池和阻塞队列的组合使用

场景

通过MQ接收消息队列,或者订阅了MQ的消息

消费端接收消息后的处理存在耗时操作,此时考虑多线程并发处理


通过线程池和阻塞队列实现

线程池是为了便于管理多线程

阻塞队列是为了确保程序运行在可控范围内,不至于因为资源耗尽而崩溃

// 将消息存储于阻塞队列中
ConsumerBlockingQueue.queue.put(textMsg.getText());


public class ConsumerBlockingQueue {


// 声明一个容量为10的缓存队列
public static BlockingQueue<String> queue = new LinkedBlockingQueue<String>(10);
// 申请一个固定数量为2的线程池
private static ExecutorService executor = Executors.newFixedThreadPool(2);


/**
* 处理消息
*/
public static void handle() {
// 启动线程
executor.execute(new Consumer(queue));
}
}


public class Consumer implements Runnable {


private static final Logger logger = Logger.getLogger(Consumer.class);


BlockingQueue<String> queue;


public Consumer(BlockingQueue<String> initQ) {
queue = initQ;
}


public void run() {
logger.info(Thread.currentThread().getName() + "启动消费者线程!");
boolean isRunning = true;
try {
while (isRunning) {
logger.info("正从队列获取数据...");
// waiting if necessary until an element becomes available.
String data = queue.take();
if (null != data) {
logger.info("拿到数据:" + data);
logger.info(Thread.currentThread().getName() + "正在消费数据:" + data);
} else {
// 超过2s还没数据,认为所有生产线程都已经退出,自动退出消费线程。
isRunning = false;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
} finally {
logger.info(Thread.currentThread().getName() + "退出消费者线程!");
}
}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值