以下的自定義線程池,使用了有界隊列,自定義的線程創建工廠和拒絕策略:
public class ThreadTest {
public static void main(String[] args) throws IOException {
int corePoolSize = 2;
int maximumPoolSize = 4;
long keepAliveTime = 10;
TimeUnit unit = TimeUnit.SECONDS;
// 有界隊列(等待最大線程數爲4)
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(4);
// 自定義線程創建工廠
ThreadFactory threadFactory = new MyThreadFactory();
// 自定義拒絕策略
RejectedExecutionHandler handler = new MyIgnorePolicy();
// 自定義線程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit,
workQueue, threadFactory, handler);
// 預啓動所有核心線程
executor.prestartAllCoreThreads();
for (int i = 1; i < 11; i++) {
MyTask task = new MyTask(String.valueOf(i));
executor.execute(task);
}
//阻塞主線程
System.in.read();
}
}
自定義線程創建工廠(MyThreadFactory):
public class MyThreadFactory implements ThreadFactory {
private final AtomicInteger mThreadNum = new AtomicInteger(1);
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r, "my-thread-" + mThreadNum.getAndIncrement());
System.out.println(t.getName() + " has been created.");
return t;
}
}
自定義拒絕策略(MyIgnorePolicy):
public class MyIgnorePolicy implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
doLog(r, e);
}
private void doLog(Runnable r, ThreadPoolExecutor e) {
// 做日誌記錄等
System.err.println(r.toString() + " rejected");
}
}
線程任務(MyTask):
public class MyTask implements Runnable {
private String name;
public MyTask(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(this.toString() + " is running!");
try {
//讓任務執行慢點
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "MyTask [name=" + name + ']';
}
}
輸出結果如下:
運行結果可以看出,其中線程1、2、5、7先佔滿了核心線程和最大線程數量,然後線程3、4、6、8進入等待隊列,線程9、10直接被忽略拒絕執行,線程1、2、5、7中有線程執行完之後會通知線程3、4、6、8繼續執行