内嵌线程池的用法

在项目中当我们需要执行的任务过多时,列如:根据某个厂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();
    }

线程池有很多方法,这里是其中一种,如果有什么不对的地方,勿喷,可能这个方法与你实际碰到的情况有所不同。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值