参考书籍:《java并发编程艺术》
线程池的执行逻辑如下:
少于corePoolSize,新建线程任务
等于或多于corePoolSize,则放进BlockQueue存储
BlockQueue 存储满的时候,创建新的线程
超过maxmiumPoolSize,拒绝创建,并调用RejectedExecutionHandler.rejectExecutor();
核心参数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
当线程数小于corePoolSize,默认是新增一个线程任务创建一个线程,也可以用实例调用prestartAllCoreThread开启所有线程。
ThreadFactory 用于设置创建线程的工厂。
RejectedExecutionHandler当队列线程池满了之后,处理策略。默认是AbortPolicy。抛出异常。
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException("Task " + r.toString() +
" rejected from " +
e.toString());
}
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
r.run();
}
}
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
e.getQueue().poll();
e.execute(r);
}
}
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}
theadPool.execute(new Runnable(){
run(){
}
})
Future<Object> future = executor.submit(harReturnValuetask);
try {
Object s = future.get();
} catch (InterruptedException e) {
//
}