1.为何要用线程池?java
线程池提供了一种限制和管理资源(包括执行一个任务)。每一个线程池还维护一些基本统计信息,例如已完成任务的数量。编程
《java并发编程的艺术》中提到使用线程池的好处:并发
下降资源消耗。经过重复利用已建立的线程下降线程建立和销毁形成的消耗。框架
提升响应速度。当任务到达时,任务能够不须要等到线程建立就能当即执行。工具
提升线程的可管理性。线程是稀缺资源,若是无限制的建立,不只会消耗系统资源,还会下降系统的稳定性,使用线程池能够进行统一的分配,调优和监控。线程
2.实现Runnable接口和Callable接口的区别code
若是想让线程池执行任务的话就须要实现Runnable接口或Callable接口。Runnable接口或Callable接口实现类均可以被ThreadPoolExecutor或ScheduledThreadPoolExecutor执行。二者的区别在于Runnable接口不会返回结果可是Callable接口能够返回结果。对象
3.执行execute()方法和submit()方法的区别是什么呢?接口
1.execute()方法用于提交不须要返回值的任务,因此没法判断任务是否被线程池执行成功与否;队列
2.submit()方法用于提交须要返回值的任务。线程池会返回future类型的对象,经过这个future对象能够判断任务是否执行成功,而且能够经过future的get()方法来获取返回值,get()方法会阻塞当前线程直到任务完成,而是用get(long timeout, TimeUnit unit) 方法则会阻塞当前线程一段时间后当即返回,这时候有可能任务没有执行完。
4.如何建立线程池
《阿里巴巴java开发手册》中强制线程池不容许使用Exexutors去建立,而是经过ThreadPoolExextor的方式,这样的处理方式让写的同窗更加明确线程池的运行规则,规避资源耗尽的风险
Executors 返回线程池对象的弊端以下: FixedThreadPool 和 SingleThreadExecutor : 容许请求的队列长度为 Integer.MAX_VALUE,可能堆积 大量的请求,从而致使OOM。 CachedThreadPool 和 ScheduledThreadPool : 容许建立的线程数量为 Integer.MAX_VALUE ,可能 会建立大量线程,从而致使OOM。
方法一:经过构造方法实现
方法二:经过Executor框架的工具类Executor来实现 咱们能够建立三种类型的ThreadPoolExecutor:
FixedThreadPool:该方法返回一个固定线程数量的线程池。该线程池中的线程数量始终不变。当有一个新的任务提交时,线程池中如有空闲线程, 则当即执行。若没有,则新的任务会被暂存在一个任务队列中,待有线程空闲时,便处理在任务队列中的任务。
SingleThreadExecutor:该方法返回一个只有一个线程的线程池。若多余一个任务被提交到该线程池,任务会被保存在一个任务队列中,待线程空闲,按先入先出的顺序执行队列中的任务。
CachedThreadPool: 该方法返回一个可根据实际状况调整线程数量的线程池。线程池的线程数量不肯定,但如有空闲线程能够复用,则会优先使用可复用的线程。若全部线程均在工做,又有新的任务提交,则会建立新的线程处理任务。全部线程在当前任务执行完毕后,将返回线程池进行复用。