1.线程池的作用
限制系统中执行线程的数量
2.为什么要用线程池
2.1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务.
2.2 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下。
3.线程池接口类
3.1 ExecutorService : 真正的线程池接口。
3.2 ScheduledExecutorService:能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。
3.3 ThreadPoolExecutor : ExecutorService的默认实现.
3.4 ScheduledThreadPoolExecutor : 继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。
4.线程池的静态工具类 Executors 常用的方法
4.1 newSingleThreadExecutor
创建一个单线程的线程池,采用无边界队列LinkedBlockingQueue.即线程有限,但队列无限.
4.2 newFixedThreadPool
创建固定大小的线程池,采用无边界队列LinkedBlockingQueue.即线程有限,但队列无限.
4.3 newCachedThreadPool
创建一个可缓存的线程池 ,采用SynchronousQueue队列.
4.4 newScheduledThreadPool
创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
5.线程池的执行策略与BlockingQueue
5.1 如果运行的线程少于 corePoolSize(最小线程数量),则 Executor始终首选添加新的线程,而不进行排队.
5.2 如果运行的线程等于或多于 corePoolSize,则 Executor始终首选将请求加入队列,而不添加新的线程。
5.3 如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。