Executor 和 ThreadPoolExecutor 实现的是线程池,主要作用是支持高并发的访问处理。
Executor 是一个接口,与线程池有关的大部分类都实现了此接口。
ExecutorService 是 Executor 的子接口;AbstractExecutorService 是 ExecutorService 的实现类,但是是抽象类。
ThreadPoolExecutor 是 AbstractExecutorService 的子类,可实例化。
Executors 是一个工厂类,用于创建线程池。
1、Executors 的 使用:
(1) newCachedThreadPool() 返回 ExecutorService 实例,创建无界限线程池,理论上线程最大个数是 Integer.MAX_VALUE,使用举例:
final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); ExecutorService executorService = Executors.newCachedThreadPool(); // 此线程池运行5个线程 for (int i = 0; i < 5; i++) { final int index = i; executorService.execute(new Runnable() { @Override public void run() { System.out.println("Thread-" + index + "-begin-" + sf.format(new Date())); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread-" + index + "-end-" + sf.format(new Date())); } }); }
运行结果:
从上图可以看出,线程在execute 加载后,基本是并发执行的,并非顺序执行。
(2) newFixedThreadPool(int) 返回 ExecutorService 实例,创建的是有界线线程池,即线程个数可以指定最大数量,如果超过最大数量,则后加入的线程需要等待。
还有api:newFixedThreadPool(int , ThreadFactory),newCachedThreadPool( ThreadFactory ) 方法同理。
(3) newSingleThreadExecutor() 创建单一线程池,实现以队列的方式来执行任务。
2、ThreadPoolExecutor 的使用:
Executors 工厂类中,很多地方是调用的 ThreadPoolExecutor 来实现的,单独调用 ThreadPoolExecutor 要考虑的相对要多一些但也更灵活。