并发编程的艺术 11章代码 生产者-消费者
执行结果
采集excelID--0
采集excelID--1
处理excelID:0---:内容0
采集excelID--2
处理excelID:1---:内容1
采集excelID--3
处理excelID:2---:内容2
采集excelID--4
处理excelID:3---:内容3
采集excelID--5
处理excelID:4---:内容4
采集excelID--6
处理excelID:5---:内容5
FastExcel
package com.cartugly.excel;
import java.util.concurrent.*;
public class FastExcel {
//线程池
private final ThreadPoolExecutor threadsPool;
//队列
private final BlockingQueue<ExcelEntity> excelQueue;
public FastExcel() {
//队列
excelQueue = new LinkedBlockingQueue<>();
//核数*2
int corePoolSize = Runtime.getRuntime().availableProcessors() * 2;
//初始化线程池
threadsPool = new ThreadPoolExecutor(corePoolSize, corePoolSize, 100,
TimeUnit.SECONDS, new LinkedBlockingQueue<>(2000),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
}
public void offerQueue() {
//入队列
ExcelOfferQueue excelOfferQueue = new ExcelOfferQueue(excelQueue);
new Thread(excelOfferQueue).start();
}
public void consumer() {
try {
while (true) {
// 两秒内取不到就退出
ExcelEntity excelEntity = excelQueue.poll(2, TimeUnit.SECONDS);
if (excelEntity == null) {
break;
}
Thread job = new Thread(new ExcelJob(excelEntity));
threadsPool.submit(job);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
FastExcel fastExcel = new FastExcel();
//采集队列
fastExcel.offerQueue();
//出队列消费
fastExcel.consumer();
}
}
ExcelService
package com.cartugly.excel;
import java.util.ArrayList;
import java.util.List;
public class ExcelService {
public ExcelService() {
}
/**
* 查询出所有的数据
* @return
*/
public List<ExcelEntity> queryAllExcels() {
ArrayList<ExcelEntity> excelEntities = new ArrayList<>();
for (int i = 0; i < 100; i++) {
ExcelEntity excelEntity = new ExcelEntity();
excelEntity.setId(i + "");
excelEntity.setContent("内容" + i);
excelEntities.add(excelEntity);
}
return excelEntities;
}
}
ExcelEntity
package com.cartugly.excel;
public class ExcelEntity {
private String id;
private String content;
public ExcelEntity() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
ExcelOfferQueue
package com.cartugly.excel;
import java.util.List;
import java.util.concurrent.BlockingQueue;
public class ExcelOfferQueue implements Runnable {
private ExcelService excelService;
private BlockingQueue<ExcelEntity> excelQueue;
public ExcelOfferQueue(BlockingQueue excelQueue) {
excelService = new ExcelService();
this.excelQueue = excelQueue;
}
@Override
public void run() {
List<ExcelEntity> excelEntities = excelService.queryAllExcels();
if (excelEntities == null) {
return;
}
if (excelEntities.size() > 0) {
for (ExcelEntity excelEntity : excelEntities) {
try {
Thread.sleep(200);
System.out.println("采集excelID--" + excelEntity.getId());
excelQueue.offer(excelEntity);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
ExcelJob
package com.cartugly.excel;
public class ExcelJob implements Runnable {
private ExcelEntity excelEntity;
public ExcelJob(ExcelEntity excelEntity) {
this.excelEntity = excelEntity;
}
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("处理excelID:" + excelEntity.getId() + "---:" + excelEntity.getContent());
}
}