为什么用线程池
(1)降低资源的消耗;(2)提高响应速度;(3)提高线程的可管理性
合理配置线程池
首先要确定任务的特性。Cpu密集型(配置的线程数最大不要超过cpu的核心数加1);io密集型(cup核心数*2比较合适。Nthreads=NCPU*UCPU*(1+W/C) NCPU是cpu核心数量,UCPU是期望的CPU利用率(该值介于0和1之间)W/C是等待时间与计算时间的比率);混合型(如何可以拆分将其拆分成一个cpu密集型和io密集型,如果执行时间相差太大,则没必要分解)。获得cup核心数的方法Runtime.getRuntime().availableProcessors().
使用ScheduleThreadPoolExecutor四种执行方式:只执行一次schedule;固定延时时间间隔执行的任务scheduleWithFixedDelay;固定时间间隔执行的任务scheduleAtFixedRate;
schedule如果不用try catch的话会吞掉异常,一定要用try catch。
Executor使用流程(见图)
CompletionService作用
谁先执行完就可以拿到先执行完的结果。
谁先执行完就可以拿到先执行完的结果。