ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[Java四种线程池的使用](http://cuisuqiang.iteye.com/blog/2019372) Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。 newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。 **(1) newCachedThreadPool** 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下: Java代码  1. package test;   2. import java.util.concurrent.ExecutorService;   3. import java.util.concurrent.Executors;   4. public class ThreadPoolExecutorTest {   5.  public static void main(String[] args) {   6.   ExecutorService cachedThreadPool = Executors.newCachedThreadPool();   7.   for (int i = 0; i 10; i++) {   8.    final int index = i;   9.    try {   10.     Thread.sleep(index * 1000);   11.    } catch (InterruptedException e) {   12.     e.printStackTrace();   13.    }   14.    cachedThreadPool.execute(new Runnable() {   15.     public void run() {   16.      System.out.println(index);   17.     }   18.    });   19.   }   20.  }   21. }   线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。 (2) newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下: Java代码  1. package test;   2. import java.util.concurrent.ExecutorService;   3. import java.util.concurrent.Executors;   4. public class ThreadPoolExecutorTest {   5.  public static void main(String[] args) {   6.   ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);   7.   for (int i = 0; i 10; i++) {   8.    final int index = i;   9.    fixedThreadPool.execute(new Runnable() {   10.     public void run() {   11.      try {   12.       System.out.println(index);   13.       Thread.sleep(2000);   14.      } catch (InterruptedException e) {   15.       e.printStackTrace();   16.      }   17.     }   18.    });   19.   }   20.  }   21. }   因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。 定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors() (3)  newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下: Java代码  ![收藏代码](http://cuisuqiang.iteye.com/images/icon_star.png) 1. package test;   2. import java.util.concurrent.Executors;   3. import java.util.concurrent.ScheduledExecutorService;   4. import java.util.concurrent.TimeUnit;   5. public class ThreadPoolExecutorTest {   6.  public static void main(String[] args) {   7.   ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);   8.   scheduledThreadPool.schedule(new Runnable() {   9.    public void run() {   10.     System.out.println("delay 3 seconds");   11.    }   12.   }, 3, TimeUnit.SECONDS);   13.  }   14. }   表示延迟3秒执行。 定期执行示例代码如下: Java代码  1. package test;   2. import java.util.concurrent.Executors;   3. import java.util.concurrent.ScheduledExecutorService;   4. import java.util.concurrent.TimeUnit;   5. public class ThreadPoolExecutorTest {   6.  public static void main(String[] args) {   7.   ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);   8.   scheduledThreadPool.scheduleAtFixedRate(new Runnable() {   9.    public void run() {   10.     System.out.println("delay 1 seconds, and excute every 3 seconds");   11.    }   12.   }, 1, 3, TimeUnit.SECONDS);   13.  }   14. }   表示延迟1秒后每3秒执行一次。 (4) newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下: Java代码 1. package test;   2. import java.util.concurrent.ExecutorService;   3. import java.util.concurrent.Executors;   4. public class ThreadPoolExecutorTest {   5.  public static void main(String[] args) {   6.   ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();   7.   for (int i = 0; i 10; i++) {   8.    final int index = i;   9.    singleThreadExecutor.execute(new Runnable() {   10.     public void run() {   11.      try {   12.       System.out.println(index);   13.       Thread.sleep(2000);   14.      } catch (InterruptedException e) {   15.       e.printStackTrace();   16.      }   17.     }   18.    });   19.   }   20.  }   21. }   结果依次输出,相当于顺序执行各个任务。 你可以使用JDK自带的监控工具来监控我们创建的线程数量,运行一个不终止的线程,创建指定量的线程,来观察: 工具目录:**C:\Program Files\Java\jdk1.6.0_06\bin\jconsole.exe** 运行程序做稍微修改: Java代码  ![收藏代码](http://cuisuqiang.iteye.com/images/icon_star.png) 1. package test;   2. import java.util.concurrent.ExecutorService;   3. import java.util.concurrent.Executors;   4. public class ThreadPoolExecutorTest {   5.  public static void main(String[] args) {   6.   ExecutorService singleThreadExecutor = Executors.newCachedThreadPool();   7.   for (int i = 0; i 100; i++) {   8.    final int index = i;   9.    singleThreadExecutor.execute(new Runnable() {   10.     public void run() {   11.      try {   12.       while(true) {   13.        System.out.println(index);   14.        Thread.sleep(10 * 1000);   15.       }   16.      } catch (InterruptedException e) {   17.       e.printStackTrace();   18.      }   19.     }   20.    });   21.    try {   22.     Thread.sleep(500);   23.    } catch (InterruptedException e) {   24.     e.printStackTrace();   25.    }   26.   }   27.  }   28. }   效果如下:  ![](http://dl.iteye.com/upload/picture/pic/129496/a37b1415-36ac-30b8-baf6-10897bbf443a.jpg) 选择我们运行的程序: ![](http://dl.iteye.com/upload/picture/pic/129498/c518b086-b144-366c-884c-58a4bf985b05.jpg) 监控运行状态 请您到ITEYE网站看 java小强 原创,谢谢! [http://cuisuqiang.iteye.com/](http://cuisuqiang.iteye.com/) ! 自建博客地址:[http://www.javacui.com/](http://www.javacui.com/) ,内容与ITEYE同步!