线程池类图
ExecutorService:是一个线程池最基本的接口,提供了提交任务,关闭线程池这些基本的方法。
ScheduledExecutorService:扩展接口,在基础线程池的功能上又新增了任务调度的功能,可以用来定时执行任务。
线程池状态
线程池中常用的方法
这里的超时时间是针对的所有tasks,而不是单个task的超时时间。如果超时,会取消没有执行完的所有任务,并抛出超时异常。相当于将每一个future的执行情况用一个list集合保存,当调用future.get()方法取值时和设置的timeout比较,是否超时。
任务调度线程池
有的时候希望任务延时执行(过几秒执行),任务反复执行(过几秒执行一次)。
ScheduledThreadPoolExecutor-延时执行
这里的任务不是串行执行,因为这里核心线程的数量正好是2 。如果这里是1那么就和timer一样是串行执行。前一个任务出现了延时或异常都不影响之后的任务。
ScheduledThreadPoolExecutor-周期执行
scheduleAtFixedRate(task,initialDelay,period,timeUnit);
task:是要执行的任务。
initialDelay:初始的延时,比如在打印start后要等待一秒才执行任务。
period:每隔一秒才会执行下一次循环的任务。每次执行任务需要2秒,而这里设置的是隔一秒循环下一次。所以要等两秒才循环下一次。
scheduleWithFixedDelay(task,initialDelay,delay,timeUnit);
与scheduleAtFixedRate不一样的是这个需要等待上一次循环的任务执行完成后才会delay再开启下一次循环的任务。所以这里要等待3s.
线程池的异常处理
线程池是不会主动去抛出异常的。一般有两种处理方式。
1.主动try catch.
2.通过实现callable接口,调用get方法。如果出现异常会把异常信息返回。