固定數量線程池(newFixedThreadPool)
package com.zhw.learning.thread;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author zhw
* 創建了一個固定大小的線程池,每次提交一個任務就創建一個線程,
* 直到線程達到線程池的最大值nThreads。線程池的大小一旦達到最大值後,
* 再有新的任務提交時則放入無界阻塞隊列中,等到有線程空閒時,
* 再從隊列中取出任務繼續執行。
*
* Executors.newFixedThreadPool(int nThreads)源碼:
* public static ExecutorService newFixedThreadPool(int nThreads) {
* return new ThreadPoolExecutor(nThreads, nThreads,
* 0L, TimeUnit.MILLISECONDS,
* new LinkedBlockingQueue<Runnable>());
* }
*/
public class FixedThreadPoolTest {
public static void main(String[] args) {
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i=0;i<5;i++){
final int index = i;
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
SimpleDateFormat sdf = new SimpleDateFormat(
"HH:mm:ss");
System.out.println("運行時間: " +
sdf.format(new Date()) + " " + index);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
fixedThreadPool.shutdown();
}
}
創建了一個固定大小爲3的線程池,然後在線程池提交了5個任務。在提交第4個任務時,因爲線程池的大小已經達到了3並且前3個任務在運行中,所以第4個任務被放入了隊列,等待有空閒的線程時再被運行。運行結果如下(注意前3個任務和後2個任務的運行時間):