国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JAVA 線程池的使用

2019-11-14 11:03:31
字體:
來源:轉載
供稿:網友

java通過Executors提供四種線程池,分別為:newCachedThreadPool創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。newFixedThreadPool 創建一個定長線程池,可控制線程最大并發數,超出的線程會在隊列中等待。newScheduledThreadPool 創建一個定長線程池,支持定時及周期性任務執行。newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。

 

(1) newCachedThreadPool創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。示例代碼如下:

package test;  import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;  public class ThreadPoolExecutorTest {   public static void main(String[] args) {    ExecutorService cachedThreadPool = Executors.newCachedThreadPool();    for (int i = 0; i < 10; i++) {     final int index = i;     try {      Thread.sleep(index * 1000);     } catch (InterruptedException e) {      e.PRintStackTrace();     }     cachedThreadPool.execute(new Runnable() {      public void run() {       System.out.println(index);      }     });    }   }  }  

 

線程池為無限大,當執行第二個任務時第一個任務已經完成,會復用執行第一個任務的線程,而不用每次新建線程。 (2) newFixedThreadPool創建一個定長線程池,可控制線程最大并發數,超出的線程會在隊列中等待。示例代碼如下:

package test;  import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;  public class ThreadPoolExecutorTest {   public static void main(String[] args) {    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);    for (int i = 0; i < 10; i++) {     final int index = i;     fixedThreadPool.execute(new Runnable() {      public void run() {       try {        System.out.println(index);        Thread.sleep(2000);       } catch (InterruptedException e) {        e.printStackTrace();       }      }     });    }   }  }  

 因為線程池大小為3,每個任務輸出index后sleep 2秒,所以每兩秒打印3個數字。定長線程池的大小最好根據系統資源進行設置。如Runtime.getRuntime().availableProcessors()

 

(3)  newScheduledThreadPool創建一個定長線程池,支持定時及周期性任務執行。延遲執行示例代碼如下:

package test;  import java.util.concurrent.Executors;  import java.util.concurrent.ScheduledExecutorService;  import java.util.concurrent.TimeUnit;  public class ThreadPoolExecutorTest {   public static void main(String[] args) {    ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);    scheduledThreadPool.schedule(new Runnable() {     public void run() {      System.out.println("delay 3 seconds");     }    }, 3, TimeUnit.SECONDS);   }  }  

 表示延遲3秒執行。

定期執行示例代碼如下:

package test;  import java.util.concurrent.Executors;  import java.util.concurrent.ScheduledExecutorService;  import java.util.concurrent.TimeUnit;  public class ThreadPoolExecutorTest {   public static void main(String[] args) {    ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);    scheduledThreadPool.scheduleAtFixedRate(new Runnable() {     public void run() {      System.out.println("delay 1 seconds, and excute every 3 seconds");     }    }, 1, 3, TimeUnit.SECONDS);   }  }  

 表示延遲1秒后每3秒執行一次。

 

(4) newSingleThreadExecutor創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。示例代碼如下:

package test;  import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;  public class ThreadPoolExecutorTest {   public static void main(String[] args) {    ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();    for (int i = 0; i < 10; i++) {     final int index = i;     singleThreadExecutor.execute(new Runnable() {      public void run() {       try {        System.out.println(index);        Thread.sleep(2000);       } catch (InterruptedException e) {        e.printStackTrace();       }      }     });    }   }  }  

 結果依次輸出,相當于順序執行各個任務。

你可以使用JDK自帶的監控工具來監控我們創建的線程數量,運行一個不終止的線程,創建指定量的線程,來觀察:工具目錄:C:/Program Files/Java/jdk1.6.0_06/bin/jconsole.exe運行程序做稍微修改:

package test;  import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;  public class ThreadPoolExecutorTest {   public static void main(String[] args) {    ExecutorService singleThreadExecutor = Executors.newCachedThreadPool();    for (int i = 0; i < 100; i++) {     final int index = i;     singleThreadExecutor.execute(new Runnable() {      public void run() {       try {        while(true) {         System.out.println(index);         Thread.sleep(10 * 1000);        }       } catch (InterruptedException e) {        e.printStackTrace();       }      }     });     try {      Thread.sleep(500);     } catch (InterruptedException e) {      e.printStackTrace();     }    }   }  }  

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平阴县| 太仓市| 吉首市| 雅江县| 太保市| 新泰市| 定陶县| 莱西市| 淮南市| 同仁县| 马鞍山市| 沙湾县| 和林格尔县| 常州市| 龙井市| 获嘉县| 久治县| 东方市| 霍邱县| 乡宁县| 凤翔县| 南漳县| 明水县| 麻江县| 城固县| 泽库县| 乌审旗| 宁都县| 石门县| 潢川县| 息烽县| 德保县| 枣阳市| 平泉县| 武功县| 固阳县| 南宫市| 江源县| 兴业县| 万州区| 昆明市|