Callable和Future:
ExecutorService 接口经常submit 方法返回一个对象,Future代表了一个异步任务的结果,可以用来取消任务、查询任务状态,还有通过get方法获得异步任务返回的结果。当调用get方法的时候,当前线程被阻塞直到任务被处理完成或者出现异常。可以通过保存Future对象来跟踪查询异步任务的执行情况。显然Runnable接口中定义的 public void run();方法并不能返回结果对象,所以concurrent包提供了Callable接口,它可以被用来返回结果对象。
ThreadPoolExecutor:
ThreadPoolExecutor实现了ExecutorService 接口,也是我们最主要使用的实现类。构造函数:
ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnitunit,BlockingQueue<Runnable> workQueue,ThreadFactorythreadFactory,RejectedExecutionHandlerhandler),
corePoolSize、maximumPoolSize、keepAliveTime共同维护着线程的创建和销毁,即使没有任务池的大小也等于核心池的大
小,最大池的大小是可同时活动的线程数的上限。如果线程已经闲置的时间超过了存活时间的话,它将被标记为一个可回收的线
程,如果当前池的大小超过了核心池的大小它将被回收。newFixedThreadPool为请求的池设置核心池和最大池的大小。
ThreadPoolExecutor允许提供一个BlockingQueue来持有等待执行的任务。、通常可以有三种队列:无限队列、有限队列和同步移交。newFixedthreadPool和
newSinglethreadExecutor默认使用无限的LinkedBlockingQueue但是这样会使资源无限制的增加,所以一个比较好的办法是使用有限队列,如ArrayBlockingQueue等
但是有限的大小就会满,满了怎么办呢,那就是饱和策略:默认是abort策略,抛出RejectedExecutionException,调用者可以通过捕获此异常进行相应的处理。
discard策略会默认放弃这个任务。discard-oldest策略会抛弃接下来要执行的任务,但是可以支持重复提交,也就是可以一直遗弃。caller-run策略既
不抛出异常,也不会遗弃任务,他会把一些任务推回到调用者那里。