在项目中当我们需要执行的任务过多时,列如:根据某个厂id查询学校下面的设备,然后根据设备id查询设备的一些属性。此时根据所有设备去查询属性的时候,由于任务过多就会用到线程池。
1、 首先创建线程池
//创建线程池
//(参数第一个10:基本线程数量。参数50:最大线程数量。参数第二个10:空闲线程被销毁前的时间。TimeUnit.MINUTES:是第二个参数的时间单位)
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 50, 10, TimeUnit.MINUTES, new LinkedBlockingQueue<>());
2、然后创建任务,在线程完成后关闭线程进入下一步
threadPoolExecutor.execute(new Runnable() {//将任务放入线程池
@Async
public void run() {
//任务内容
}
})
threadPoolExecutor.shutdown();
try {
//当shutdown()请求发送后, 要求等待所有线程都完成 任务后才能关闭线程
threadPoolExecutor.awaitTermination(3, TimeUnit.HOURS);
} catch (InterruptedException e) {
e.printStackTrace();
}
举例:
现有一个厂的所有设备,需要所有设备的信息,根据设备编码查询设备信息。假设设备有28万。
List<T> a;//这里有一个厂的所有设备
//创建线程池(这里最大开启线程任务50,也就是最多50给线程任务)
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 50, 10, TimeUnit.MINUTES, new LinkedBlockingQueue<>());
//循环所有设备
for (int i = 0; i < a.size(); i++) {
int finalI = i;//需要赋值才能传入
@Async
public void run() {//每个任务查询一个设备的信息
try {
List<T> b=sisInterfaceService.查询信息方法(传入设备编码 a.get(finalI).getId());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//注意:每个线程池后面加上这个,表示等待这个线程池所有线程完成后,再执行先下一步。不加可能线程还未完成就会执行下一步。
threadPoolExecutor.shutdown();
try {
//当shutdown()请求发送后, 要求等待所有线程都完成 任务后才能关闭线程
threadPoolExecutor.awaitTermination(3, TimeUnit.HOURS);
} catch (InterruptedException e) {
e.printStackTrace();
}
线程池有很多方法,这里是其中一种,如果有什么不对的地方,勿喷,可能这个方法与你实际碰到的情况有所不同。