通过线程池把大任务分成小任务并汇总小任务结果的逻辑总结

一:在线程池的使用场景中,常常会碰到把一个大任务分成多个小任务然后汇总的情况,那么该如何处理这个问题呢?

 

二:首先要明确的是创建线程任务可以通过实现Runnable接口与Callable接口,两种形式的主要区别是前者接口方法无返回值,而后者可以有返回值。

1.如何得到Runable接口类型的线程任务的返回值:(无法获取)

ExecutorService接口有两种执行任务的方式,分别是execute()与submit(),前者无返回值,后者有返回值。通过传递一个Runnable接口实现类即可返回一个Future接口。但是Runable接口的任务是无返回值的,因此通过Future接口方法get()方法获取到的值是空的,

2.如何得到Callable接口类型线程任务的返回值

由于Callable接口的接口方法原本就有返回值,所以可以直接以Callable接口实现类为参数,传递给ExecutorService的submit方法,一样可以得到返回值Furure接口,进而一样可以通过接口方法get()获得线程的返回值

3.如何通过线程池同时处理多个任务并得到返回值 

ExecutorService的接口方法只能提供存储Callable类型的list集合,因此想要处理多个任务并得到每个任务的结果,只能创建Callable类型任务,并存储在集合里面,然后把该集合传递给invokeAll()方法,该方法会返回一个存储Future接口的方法,遍历每一个Future接口的get方法即可拿到每个任务的返回值。值得注意的是,虽然是创建了多个线程,但是ExecutorService.invokeAll()方法在主线程中是阻塞的(但是submit()方法却不是阻塞的),也就是需要等待提交的任务执行完后,才会继续执行主线程后面的代码

四:线程池的参数的设置依据

        如果是io密集型任务,也就是需要频繁操作文件的,核心线程数应该为cpu核心数的2倍,也就是2n;如果是cpu密集型,也就是需要大量计算的,如排序等,则核心线程数应该是cpu核心数+1,也就是n+1

最后:附上后端技术交流圈,欢迎各位大佬入圈交流技术......V:ff1341658(先添加好友后拉群,请备注:小白不黑)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值