3種線程池
阿新 • • 發佈:2018-08-24
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種線程池