自定義執行緒池(執行緒池7個引數)
阿新 • • 發佈:2021-02-05
技術標籤:多執行緒與高併發
自定義執行緒池(執行緒池7個引數)
package src.main.java.com.qqjx.thread;
/*
* @Auther wangpeng
* @Date 2021/2/4
*/
import java.io.IOException;
import java.util.concurrent.*;
public class T05_00_HelloThreadPool {
static class Task implements Runnable {
private int i;
public Task(int i) {
this.i = i;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " Task " + i);
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public String toString() {
return "Task{" +
"i=" + i +
'}';
}
}
public static void main(String[] args) {
//ThreadPool 維護著兩個內容 一個是執行緒佇列 另外一個是任務佇列
//執行緒池7個引數
//corePoolSize 核心執行緒數
//maxmumPoolSize 最大執行緒數
//keepAliveTime 空閒時間 如果空閒時間執行緒沒有幹活 將歸還給作業系統
//第五個引數 BlockingQueue 阻塞佇列 看原始碼 ThreadPoolExecutor()構造方法 BlockingQueue<Runnable> workQueue
//第六個引數 預設的執行緒工廠
//第七個引數 拒絕策略 執行緒忙 而且任務佇列滿的時候 要執行的拒絕策略
//拒絕策略有 Abort 拋異常 Discard 扔掉 DiscardOldest 扔掉排隊時間最久的 CallerRuns 呼叫者處理任務
ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 4,
60, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(4),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
for (int i = 0; i < 8; i++) {
tpe.execute(new Task(i));
}
System.out.println(tpe.getQueue());
tpe.execute(new Task(100));
System.out.println(tpe.getQueue());
tpe.shutdown();
}
}
[Task{i=2}, Task{i=3}, Task{i=4}, Task{i=5}]
main Task 100
pool-1-thread-1 Task 0
pool-1-thread-2 Task 1
pool-1-thread-3 Task 6
pool-1-thread-4 Task 7