使用线程池的目的
线程是稀缺资源,不能频繁的创建
解耦作用:线程的创建与执行完全分开,方便维护
将其放入一个池子中,可以给其他任务进行复用
优点
降低资源消耗,通过重复利用已创建的线程来降低线程创建和销毁造成的消耗。
提高相应速度,当任务到达时,任务可以不需要的等到线程创建就能立即执行。
提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅仅会消耗系统资源,还会降低体统的稳定性,使用线程可以进行统一分配,调优和监控
创建线程池的方式在 JDK 1.5 之后推出了相关的 api,常见的创建线程池方式有以下三种:
Executors.newCachedThreadPool():无限线程池,线程池动态扩容
Executors.newFixedThreadPool(nThreads):创建固定大小的线程池
Executors.newSingleThreadExecutor():创建单个线程的线程池
Executors.newScheduledThreadPool():定时执行的线程池
JDK1.8新增
Executors.newWorkStealingPool(): newWorkStealingPool适合使用在很耗时的操作,但是newWorkStealingPool不是ThreadPoolExecutor的扩展,它是新的线程池类ForkJoinPool的扩展,但是都是在统一的一个Executors类中实现,由于能够合理的使用CPU进行对任务操作(并行操作),所以适合使用在很耗时的任务中
但是在阿里巴巴开发规约中对线程池的创建有以下几个强制要求:
可以看到规约是不允许使用Executors直接创建线程池的,而要通过ThreadPoolExecutor的方式创建
1 public static ExecutorService newCachedThreadPool() { 2 return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 3 60L, TimeUnit.SECONDS, 4 new SynchronousQueue<Runnable>()); 5 }