zoukankan      html  css  js  c++  java
  • Java通过Executors提供四种线程池

    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代码  收藏代码
    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 FilesJavajdk1.6.0_06injconsole.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. }  

     
    效果如下:

     

    选择我们运行的程序:

    监控运行状态

  • 相关阅读:
    geoserver发布地图服务WMTS
    geoserver发布地图服务WMS
    geoserver安装部署步骤
    arcgis api 3.x for js 入门开发系列十四最近设施点路径分析(附源码下载)
    arcgis api 3.x for js 入门开发系列十三地图最短路径分析(附源码下载)
    cesium 之自定义气泡窗口 infoWindow 后续优化篇(附源码下载)
    arcgis api 3.x for js 入门开发系列十二地图打印GP服务(附源码下载)
    arcgis api 3.x for js 入门开发系列十一地图统计图(附源码下载)
    arcgis api 3.x for js 入门开发系列十叠加 SHP 图层(附源码下载)
    arcgis api 3.x for js入门开发系列九热力图效果(附源码下载)
  • 原文地址:https://www.cnblogs.com/webglcn/p/5265901.html
Copyright © 2011-2022 走看看