import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
/**
* 应用场景: 数据同步,数据初始化
* 比如第三方提供了一个分页接口,需要循环调用
*
* @Author 青临
* @Date 2024/3/14 17:11
**/
public class demo {
public static void main(String[] args) {
int size = 2000; // 初始化容器长度,这个长度根据实际情况来
ArrayBlockingQueue<List<Object>> queue = new ArrayBlockingQueue<>(size); // 创建一个容量为size的阻塞队列
AtomicLong atomicLong = new AtomicLong(size); // 创建一个AtomicLong用于计数
ExecutorService producer = Executors.newFixedThreadPool(2); // 生产者线程池
ExecutorService consumer = Executors.newFixedThreadPool(2); // 消费者线程池
for (int i = 1; i <= size; i++) { // 遍历每一页
producer.execute(() -> {
try {
// TODO 发起http请求,依次请求每一页数据,将结果组装成list后put进queue
List<Object> list = new ArrayList<>(); // 创建一个列表存放数据
queue.put(list); // 将数据放入队列
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
atomicLong.decrementAndGet(); // 每处理完一个数据,计数减一
}
});
}
consumer.execute(() -> {
try {
while (true) {
if (atomicLong.get() == 0 && queue.size() == 0) {
break;
}
List<Object> take = queue.take(); // 从队列中取出数据
// TODO 执行入库操作
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
producer.shutdown();
consumer.shutdown(); // 关闭消费者线程池
}
}
使用多线程的生产者,消费者模式实现数据同步
于 2024-03-14 17:34:21 首次发布