Java經過Executors提供四種線程池,分別爲:java
線程代碼:緩存
package org.morecare.thread; public class ThreadForpools implements Runnable{ private Integer index; public ThreadForpools(Integer index) { this.index=index; } @Override public void run() { /*** * 業務......省略 */ try { System.out.println("開始處理線程!!!"); Thread.sleep(index*100); System.out.println("個人線程標識是:"+this.toString()); } catch (InterruptedException e) { e.printStackTrace(); } } }
建立一個可緩存線程池,應用中存在的線程數能夠無限大服務器
package org.morecare.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class NewCachedThreadPool { /** * 咱們獲取四次次線程,觀察4個線程地址 * @param args */ public static void main(String[]args) { ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); System.out.println("****************************newCachedThreadPool*******************************"); for(int i=0;i<4;i++) { final int index=i; newCachedThreadPool.execute(new ThreadForpools(index)); } } }
輸出結果是:能夠有無限大的線程數進來(線程地址不同),但須要注意機器的性能,須要線程太多,會致使服務器出現問題。併發
建立一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待。示例代碼以下:ide
package org.morecare.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class NewFixedThreadPool { /** * 咱們獲取四次次線程,觀察4個線程地址 * @param args */ public static void main(String[]args) { //線程池容許同時存在兩個線程 ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2); System.out.println("****************************newFixedThreadPool*******************************"); for(int i=0;i<4;i++) { final int index=i; newFixedThreadPool.execute(new ThreadForpools(index)); } } }
Executors.newFixedThreadPool(2);在線程池中保持二個線程能夠同時執行,可是注意,並非說線程池中永遠都是這二個線程,只是說能夠同時存在的線程數,當某個線程執行結束後,會有新的線程進來性能
輸出結果:每次只有兩個線程在處理,當第一個線程執行完畢後,新的線程進來開始處理(線程地址不同)this
建立一個定長線程池,支持定時及週期性任務執行。延遲執行示例代碼以下:spa
package org.morecare.thread; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class NewScheduledThreadPool { /** * 咱們獲取四次次線程,觀察4個線程地址 * @param args */ public static void main(String[]args) { ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(2); System.out.println("****************************newFixedThreadPool*******************************"); for(int i=0;i<4;i++) { final int index=i; //延遲三秒執行 newScheduledThreadPool.schedule(new ThreadForpools(index),3, TimeUnit.SECONDS); } } }
執行結果:延遲三秒以後執行,除了延遲執行以外和newFixedThreadPool基本相同,能夠用來執行定時任務線程
newScheduledThreadPool共計有三個方法:3d
schedule(commod,delay,unit) ,這個方法是說系統啓動後,須要等待多久執行,delay是等待時間。只執行一次,沒有周期性。
scheduleAtFixedRate(commod,initialDelay,period,unit),這個是以period爲固定週期時間,按照必定頻率來重複執行任務,initialDelay是說系統啓動後,須要等待多久纔開始執行。例如:若是設置了period爲5秒,線程啓動以後執行了大於5秒,線程結束以後,當即啓動線程的下一次,若是線程啓動以後只執行了3秒就結束了那執行下一次,須要等待2秒再執行。這個是優先保證任務執行的頻率,
scheduleWithFixedDelay(commod,initialDelay,delay,unit),這個是以delay爲固定延遲時間,按照必定的等待時間來執行任務,initialDelay意義與上面的相同。例如:設置了delay爲5秒,線程啓動以後無論執行了多久,結束以後都須要先生5秒,才能執行下一次。這個是優先保證任務執行的間隔。
建立一個單線程化的線程池,它只會用惟一的工做線程來執行任務,保證全部任務按照指定順序(FIFO, LIFO, 優先級)執行。示例代碼以下:
package org.morecare.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class NewSingleThreadExecutor { /** * 咱們獲取四次次線程,觀察4個線程地址 * @param args */ public static void main(String[]args) { ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor(); System.out.println("****************************newFixedThreadPool*******************************"); for(int i=0;i<4;i++) { final int index=i; newSingleThreadExecutor.execute(new ThreadForpools(index)); } } }