package advancedJava;java
import java.util.concurrent.ExecutorService;編程
import java.util.concurrent.Executors;緩存
import java.util.concurrent.TimeUnit;ide
* java 線程池學習工具
* @author: cuiHoop
* Date: 13-12-7學習
public class ThreadPoolTest {測試
* 線程池的概念ui
* jdk5提出了ThreadPool的概念spa
* 之因此採用線程池的主要緣由在於:
* 線程時間=T1(建立時間)+T2(運行時間)+T3(銷燬時間)
* 線程池則能夠一個線程空閒下來後爲另外一個服務,這樣子,就達到了總體的效果,
* 嘿嘿(敏捷團隊的每個人同樣)
* 四種種靜態工廠線程池
* 固定線程池
* 緩存線程池
* 單一線程池 (採用替補的方式)
* 另外,還有定時器的線程池 (使用能夠參考Timer的使用)
public static void main(String[] args) {
* 測試實例說明
* 有100個任務,一次提交給線程池10個,分析線程池,每次的處理狀況
//固定的線程池
// ExecutorService threadPool = Executors.newFixedThreadPool(3); //Executor是一個工具類,聲明瞭一個具備三個線程的線程池
//緩存的線程池 ,根據任務量自動增長線程數量,和回收 ,就會自動增長到十個線程
// ExecutorService threadPool = Executors.newCachedThreadPool();
//線程池中只有一個線程,可是線程死了後能夠對另外一個線程調用從新啓動,(單線程池)
ExecutorService threadPool = Executors.newSingleThreadExecutor();
for (int i = 0;i<10;i++){
final int finalI = i;
threadPool.execute(new Runnable() { //任務執行
@Override http://www.huiyi8.com/jiaoben/
public void run() {flash特效
for(int j = 0;j<10;j++){
try {
Thread.sleep(20); //便於輸出觀看
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" loop of " + finalI +
" for task of "+ j); //某個線程正在進行第幾回循環
System.out.println("all of 10 tasks have committed");
// threadPool.shutdown();
//採用定時任務,定時器任務類型
Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("bombing");
},5,2, TimeUnit.SECONDS); //5秒以後炸,每一個2秒炸一下 ,schedule(定時任務)或者schedule以後定時,最後一個是單位
/**分析
* 真正的線程接口是ExecutorService,而Executor是一個頂級的接口。
* 線程池的編程模式下,任務是提交給整個池子,由池子來負責分配任務;至關於,先接手(接受任務防止長時間的等待),接手後進行細節分配。
* 任務是提交給線程池的,可是一個線程只能執行一個任務,可是能夠同時向線程池提交多個任務。
* 可是對於高端的使用,須要本身定製線程池