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();
}
}