zoukankan      html  css  js  c++  java
  • Java 四种线程池的使用

    java线程线程池监控 

    Java通过Executors提供四种线程池,分别为:

    • newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
    • newFixedThreadPool: 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
    • newScheduledThreadPool: 创建一个定长线程池,支持定时及周期性任务执行。
    • newSingleThreadExecutor: 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

    (1) newCachedThreadPool
    创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

    示例代码如下:

    Java代码  

     1       package test;  
     2  
     3       import java.util.concurrent.ExecutorService;  
     4       import java.util.concurrent.Executors; 
     5       public class ThreadPoolExecutorTest {  public static 
     6         void main(String[] args) {  
     7   
     8           ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  
     9           for (int i = 0; i < 10; i++) {  
    10             final int index = i;  
    11             try {  
    12               Thread.sleep(index * 1000);  
    13             } catch (InterruptedException e) {  
    14               e.printStackTrace();  
    15             }  
    16             cachedThreadPool.execute(new Runnable() {  
    17               public void run() {  
    18                 System.out.println(index);  
    19               }  
    20             });  
    21 
    22            }  
    23          }  
    24        }    

    线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
     
    (2) newFixedThreadPool
    创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

    示例代码如下:

    Java代码  

     1         package test; 
     2  
     3         import java.util.concurrent.ExecutorService;  
     4         import java.util.concurrent.Executors;  
     5 
     6         public class ThreadPoolExecutorTest {  
     7             public static void main(String[] args) {  
     8                 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);  
     9                 for (int i = 0; i < 10; i++) {  
    10                     final int index = i;  
    11                     fixedThreadPool.execute(new Runnable() {  
    12                         public void run() {  
    13                             try {  
    14                                 System.out.println(index);  
    15                                 Thread.sleep(2000);  
    16                             } catch (InterruptedException e) {  
    17                                 e.printStackTrace();  
    18                             }  
    19                         }      
    20                     });  
    21                 }  
    22             }  
    23         }  

     
    因为线程池大小为3,每个任务输出indexsleep 2秒,所以每两秒打印3个数字。
    定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()

    (3)  newScheduledThreadPool
    创建一个定长线程池,支持定时及周期性任务执行。

    延迟执行示例代码如下:

    Java代码  

     1             package test;  
     2 
     3             import java.util.concurrent.Executors;  
     4             import java.util.concurrent.ScheduledExecutorService;  
     5             import java.util.concurrent.TimeUnit;  
     6 
     7             public class ThreadPoolExecutorTest {  
     8                 public static void main(String[] args) {  
     9                     ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);  
    10                     scheduledThreadPool.schedule(new Runnable() {  
    11                         public void run() {  
    12                         System.out.println("delay 3 seconds");  
    13                         }  
    14                     }, 3, TimeUnit.SECONDS);  
    15                 }  
    16             }

     
    表示延迟3秒执行。

    定期执行示例代码如下:

    Java代码  

     1             package test;  
     2 
     3             import java.util.concurrent.Executors;  
     4             import java.util.concurrent.ScheduledExecutorService;  
     5             import java.util.concurrent.TimeUnit;  
     6 
     7             public class ThreadPoolExecutorTest {  
     8                 public static void main(String[] args) {  
     9                     ScheduledExecutorService scheduledThreadPool =              Executors.newScheduledThreadPool(5);  
    10                     scheduledThreadPool.scheduleAtFixedRate(new Runnable() {  
    11                         public void run() {  
    12                             System.out.println("delay 1 seconds, and excute every 3 seconds");  
    13                         }  
    14                     }, 1, 3, TimeUnit.SECONDS);  
    15                 }  
    16             }  

     
    表示延迟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 
     3             import java.util.concurrent.ExecutorService;  
     4             import java.util.concurrent.Executors;  
     5 
     6             public class ThreadPoolExecutorTest {  
     7                 public static void main(String[] args) {  
     8                     ExecutorService singleThreadExecutor =     Executors.newCachedThreadPool();  
     9                     for (int i = 0; i < 100; i++) {  
    10                         final int index = i;  
    11                         singleThreadExecutor.execute(new Runnable() {  
    12                             public void run() {  
    13                                 try {  
    14                                     while(true) {  
    15                                         System.out.println(index);  
    16                                         Thread.sleep(10 * 1000);  
    17                                     }  
    18                                 } catch (InterruptedException e) {  
    19                                     e.printStackTrace();  
    20                                 }  
    21                             }  
    22                         });  
    23                         try {  
    24                             Thread.sleep(500);  
    25                         } catch (InterruptedException e) {  
    26                             e.printStackTrace();  
    27                         }  
    28                     }  
    29                 }  
    30             }         
  • 相关阅读:
    南京网络赛a(离线 树状数组)
    super_log(欧拉降幂)
    ac自动机模板 hdu2222
    Seek the Name, Seek the Fame POJ
    Power Strings(求循环次数最多的循环节 kmp)
    Period(循环节 nxt数组的应用)
    kmp 算法回顾(Number Sequence HDU
    最短路 2 (百度之星 初赛3 B)(floyd)
    path(优先队列,dijk拓展)
    (银联复赛)爱喝「肥宅快乐水」的班长
  • 原文地址:https://www.cnblogs.com/edithZY/p/5841203.html
Copyright © 2011-2022 走看看