线程安全与阻塞机制:BlockingQueue是一个基于阻塞机制实现的线程安全队列。它通过在入队和出队操作时加锁来避免并发操作,从而保证队列的线程安全性。
应用场景:BlockingQueue常用于生产者-消费者模型中,其中生产者负责向队列添加元素,消费者则从队列中获取元素。这种模式通过队列平衡生产者和消费者的处理能力。
基本操作:BlockingQueue提供了两种基本操作:take()和put()。take操作会从队列中获取一个元素,如果没有元素则阻塞直到有元素;put操作则会尝试将一个元素插入队列,如果有空间则直接插入,如果没有空间则阻塞直到有空间。
一、初始化队列
@Bean("tasks")
public BlockingQueue<T> tasks(){
BlockingQueue<T> tasks = null;
//建议根据配置文件初始化队列类型
if(条件){
tasks = new LinkedBlockingQueue<T>(10000);
}
if(条件){
tasks = new PriorityBlockingQueue<T>(10000);
}
return tasks;
}
二、放入任务队列和从队列获取任务
@Component
public class ProcessQueueService{
//队列
@AutoWired
private BlockingQueue<T> tasks;
//最大线程数
@Value(${max_taks_thread:20})
private int maxTaskThread;
//添加到队列
public boolean addToQueue(T t){
int size = tasks.size();
boolean isEmpty = tasks.isEmpty;
return tasks.offer(t);
}
//队列初始化
@PostConstruct
public void init(){
for(int i = 0;i < maxTaskThread; i++){
new Thread(() -> {
while(runing){
try{
T t = tasks.take();
//执行功能代码
}catch(InterruptedException e){
//
}
}
}
}
}
}