一:在线程池的使用场景中,常常会碰到把一个大任务分成多个小任务然后汇总的情况,那么该如何处理这个问题呢?
二:首先要明确的是创建线程任务可以通过实现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(先添加好友后拉群,请备注:小白不黑)