1. 程式人生 > >3種線程池

3種線程池

cached exc edt rup ews 同時 nds adp lee

package cn.itcast.heima2; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class ThreadPoolTest { /** * @param args */ public static void main(String[] args) { //線程池 自定義每次只能同時執行3個線程 ExecutorService threadPool = Executors.newFixedThreadPool(3); //緩存線程池 可根據需要動態變化 可同時執行的線程數量 //ExecutorService threadPool = Executors.newCachedThreadPool(); //單線程池 線程死亡自動啟動另一個線程 保證線程池有線程在運行 //ExecutorService threadPool = Executors.newSingleThreadExecutor(); for(int i=1;i<=10;i++){ final int task = i; threadPool.execute(new Runnable(){ @Override public void run() { for(int j=1;j<=10;j++){ try { Thread.sleep(20); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(/*Thread.currentThread().getName() +" of"+*/" task "+ task +" has loop " + j + " times " ); } } }); } //以上代碼雖然讓線程以啟動 但每個線程的run方法在執行的同時 以下的代碼也同時執行 //如果此時調用shutdownNow()方法,很有可能會讓執行一半的run方法停止 從而運行時報線程本打斷的錯誤 //threadPool.shutdownNow(); //改為調用次方法 當全部線程空閑才關閉線程池 threadPool.shutdown(); System.out.println("all of 10 tasks have committed! "); //定時器 6s後執行 每個2s執行一次 缺點只能定制幾秒以後 可以用目標時間減去此刻時間實現 Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable(){ public void run() {System.out.println("bombing!");} },6,2,TimeUnit.SECONDS); } }

3種線程池