public class TestThreadPool {
public static void main(String[] args) throws ExecutionException {
//所使用阻塞隊列
//直接提交策策略,工作隊列不保存任何任務被等待執行,而是直接提交給線程進行執行。newCachedThreadPool所使用阻塞隊列
//使用此阻塞隊列時num不能大於maximumPoolSize,否則將報錯(因爲直接執行)
//並且一次性執行num個線程
BlockingQueue<Runnable> queue = new SynchronousQueue<>();
//無界隊列策略,工作隊列大小沒有上限,可以添加無數個任務進行等待。newFixedThreadPool使用阻塞隊列
//使用此阻塞隊列時num能大於maximumPoolSize(因爲無界,實際上就是maximumPoolSize已經無效了)
//並且一次性執行corePoolSize個線程
BlockingQueue<Runnable> queue2 = new LinkedBlockingQueue<>();
//有界隊列策略,工作隊列大小有上限(防止工作隊列被無休止的添加)
//這個隊列會保持隊列中有capacity個線程在等待,其餘線程執行
BlockingQueue<Runnable> queue3 = new ArrayBlockingQueue<>(3); //capacity = 3
//丟棄任務並拋出RejectedExecutionException異常
//ThreadPoolExecutor.AbortPolicy
//丟棄任務,但是不拋出異常
//ThreadPoolExecutor.DiscardPolicy
//丟棄隊列最前面的任務,然後重新提交被拒絕的任務
//ThreadPoolExecutor.DiscardOldestPolicy
//由調用線程(提交任務的線程)處理該任務
//ThreadPoolExecutor.CallerRunsPolicy
//核心線程數量
int corePoolSize = 2;
//最大線程池大小
int maximumPoolSize = 10;
//創建線程數量
int num = 10;
ExecutorService pool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
60, TimeUnit.SECONDS, queue3);
for (int i = 0; i < num; i++) {
pool.execute(()->{
try {
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName()+"執行了一次run()");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
pool.shutdown();
}
}