1.介绍
Callable和Runnable都封装一个异步运行的任务:
Runnable:可以看成一个无参,无返回值的接口
Callable:有返回值的接口,里面有一个call()方法
Future :用来保存异步计算的结果,启动一个计算,将Future对象交给这个线程,忘掉它,Furture对象的所用者将会在得出结果后就可以得到这个值
2.FutureTask包装器:可以将Callable转换成Runnable,同时实现了这二中接口。
Callable<String> call=new Callable(); FutureTask<String >tack=new Future<String>(call); //将Callable转换成Runnable Thread th=new Thread(tack); //创建线程 th.start(); //开启线程 String try=tack.get() //执行任务,调用阻塞,直到结束2.3线程池的参数
ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); } corePoolSize:核心线程数量 maximumPoolSize:最大线程数量; workQueue:等待队列,当任务提交时,如果线程池中的线程数量大于等于corePoolSize的时候,把该任务封装成一个Worker对象放入等待队列; keepAliveTime:线程池维护线程所允许的空闲时间。当线程池中的线程数量大于corePoolSize的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了keepAliveTime; TimeUnit :时间级别 threadFactory:它是ThreadFactory类型的变量,用来创建新线程。 handler:它是RejectedExecutionHandler类型的变量,表示线程池的饱和策略。如果阻塞队列满了并且没有空闲的线程,这时如果继续提交任务,就需要采取一种策略处理该任务。 ThreadFactory:定义线程池中创建的线程,如线程名称,优先级等,可以几次ThreadFactory重新newThread(Runnable r)方法。2.4线程池执行的基本流程
当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭参考链接
[https://www.jianshu.com/p/9beab78a3afe]: