java4种线程池的使用

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代码  

  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代码  

  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. }

效果如下:

选择我们运行的程序:

监控运行状态

时间: 2024-10-12 19:20:39

java4种线程池的使用的相关文章

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

JAVA中的4种线程池的使用

Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待.newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行.newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有

Java四种线程池

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:2015-10-20 22:37:40      阅读:8762      评论:0      收藏:0      [点我收藏+] 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异

Java四种线程池的使用

Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待.newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行.newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有

几种线程池的实现算法分析

1. 前言 在阅读研究线程池的源码之前,一直感觉线程池是一个框架中最高深的技术.研究后才发现,线程池的实现是如此精巧.本文从技术角度分析了线程池的本质原理和组成,同时分析了JDK.Jetty6.Jetty8.Tomcat的源码实现,对于想了解线程池本质.更好的使用线程池或者定制实现自己的线程池的业务场景具有一定指导意义. 2. 使用线程池的意义 复用:类似WEB服务器等系统,长期来看内部需要使用大量的线程处理请求,而单次请求响应时间通常比较短,此时Java基于操作系统的本地调用方式大量的创建和销

几种线程池的实现算法分析【转载】

原文地址 本文内容 前言 线程池意义 线程池技术要点 小节 参考源码 但凡是一个框架,基本都会涉及线程池问题.虽然你可能没有直接使用,那是因为框架帮你完成了这部分工作. 说,为什么需要线程池呢?试想,现在但凡是写一个服务程序,如果不采用并发或并行的方式,都有点对不起4核.8核,甚至更多的CPU内核,但是如果每次需要线程,都创建一次,这对性能的消耗,比较大,更加合适的做法是,在程序初始化时,一次性把所有线程都创建好,这样,当需要的时候,直接拿来过用~ 前言 在阅读研究线程池的源码之前,一直感觉线程

JAVA四种线程池实例

1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java 1 2 3 4 5 6 7 new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 那你就out太多了,new Thread的弊端如下: a. 每次new Thread新建对象性能差. b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及

几种线程池的实现分析(转)

1. 前言 在阅读研究线程池的源码之前,一直感觉线程池是一个框架中最高深的技术.研究后才发现,线程池的实现是如此精巧.本文从技术角度分析了线程池的本质原理和组成,同时分析了JDK.Jetty6.Jetty8.Tomcat的源码实现,对于想了解线程池本质.更好的使用线程池或者定制实现自己的线程池的业务场景具有一定指导意义. 2. 使用线程池的意义 复用:类似WEB服务器等系统,长期来看内部需要使用大量的线程处理请求,而单次请求响应时间通常比较短,此时Java基于操作系统的本地调用方式大量的创建和销

Java四种线程池的学习与总结

在Java开发中,有时遇到多线程的开发时,直接使用Thread操作,对程序的性能和维护上都是一个问题,使用Java提供的线程池来操作可以很好的解决问题. 一.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable(){ @Override public void run(){ //TODO Auto-generatedmethod stub } } ).start(); 那你就out太多了,new Thread的弊端如下: