只会创建唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。 如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它 。
单工作线程最大的特点是:可保证顺序地执行各个任务。
示例:
public class SingleThreadExecutorDemo { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); for (int i = 0; i < 100; i++) { executorService.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + " 执行"); } }); } executorService.shutdown(); } } newFixedThreadPool创建一个固定大小的线程池。
每次提交一个任务就会新创建一个工作线程,如果工作线程数量达到线程池最大线程数,则将提交的任务存入到阻塞队列中。
FixedThreadPool 是一个典型且优秀的线程池,它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。但是,在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。
示例:
public class FixedThreadPoolDemo { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(3); for (int i = 0; i < 100; i++) { executorService.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + " 执行"); } }); } executorService.shutdown(); } } newCachedThreadPool创建一个可缓存的线程池。
如果线程池长度超过处理任务所需要的线程数,就会回收部分空闲的线程;
如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为 1 分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。
此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说 JVM)能够创建的最大线程大小。 因此,使用 CachedThreadPool 时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。
示例:
public class CachedThreadPoolDemo { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < 100; i++) { executorService.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + " 执行"); } }); } executorService.shutdown(); } } newScheduleThreadPool创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
public class ScheduledThreadPoolDemo { public static void main(String[] args) { schedule(); scheduleAtFixedRate(); } private static void schedule() { ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5); for (int i = 0; i < 100; i++) { executorService.schedule(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + " 执行"); } }, 1, TimeUnit.SECONDS); } executorService.shutdown(); } private static void scheduleAtFixedRate() { ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5); for (int i = 0; i < 100; i++) { executorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + " 执行"); } }, 1, 1, TimeUnit.SECONDS); } executorService.shutdown(); } } 参考资料《Java 并发编程实战》
《Java 并发编程的艺术》
深入理解 Java 线程池:ThreadPoolExecutor
java 并发编程--Executor 框架