1.newSingleThreadExecutor
这个方法创建的线程池里只能同时运行一个线程,如果该线程在执行途中异常结束了,线程池会重新创建一个线程继续执行。
2.FixedThreadPool(int Threads)
这种线程池里可同时运行指定数量的线程,每完成了一个任务时就再创建一个线程去执行任务,直到线程数量达到线程池可同时运行的最大值,同singleThreadExecutor,如果有一个线程异常结束了,会自动创建一个线程补充其执行。
3.CachedThreadPool
这种线程池也是在完成一个任务后再创建一个线程,但不同于fixedThreadPool的是它没有限制数量,它里面所能容纳的最大线程数量理论上是依据计算机内存的大小而定的。另外,当线程池大小超过需要运行的线程时,线程池就会回收空闲的线程。而任务增加时又将智能的添加新线程来执行任务。
在JDK帮助文档中,有如此一段话:“强烈建议程序员使用较为方便的Executors工厂方法Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)、Executors.newFixedThreadPool(int)(固定大小线程池)和Executors.newSingleThreadExecutor()(单个后台线程)。它们均为大多数使用场景预定义了设置。”
我测试了三种线程池,代码如下:
- class MyThread extends Thread {
- int i = 0;
-
-
- public void run() {
- while (i++ < 3)
- System.out.println(this.getName() + "正在被执行。。。。。");
- }
- }
-
-
- public class ThreadPool {
-
- public static void executeMethod(ExecutorService es) {
-
- for (int x : new int[5]) {
- es.execute(new MyThread());
- }
- }
- }
-
- class SingleThread {
- public static void main(String[] args) {
-
- ExecutorService singleThread = Executors.newSingleThreadExecutor();
-
- System.out.println("这是执行singleThreadPool的结果:");
-
- ThreadPool.executeMethod(singleThread);
-
- singleThread.shutdown();
-
- }
- }
-
- class FixedThread {
- public static void main(String[] args) {
-
- ExecutorService fixedThread = Executors.newFixedThreadPool(3);
- System.out.println("这是执行FixedThreadPool的结果:");
- ThreadPool.executeMethod(fixedThread);
- fixedThread.shutdown();
-
-
-
- }
- }
-
- class CachedThread {
- public static void main(String[] args) {
-
- ExecutorService cachedThread = Executors.newCachedThreadPool();
- System.out.println("这是执行CachedThreadPool的结果:");
- ThreadPool.executeMethod(cachedThread);
- cachedThread.shutdown();
-
- }
- }