在实际工作中,线程的创建与销毁都会占用系统资源,因此可以考虑使用线程池。
java.util.concurrent.Executors
newSingleThreadExecutor:创建一个只有一个线程的线程池,如果唯一的线程因异常结束,会有新的线程来替代它。底层是根据ThreadPoolExecutor创建一个LinkedBlockingQueue大小的线程池。
newCachedThreadPool:创建一个大小可以伸缩的线程池,如果没有可用的线程,则添加一个新的线程,同时会清理掉60s未响应的线程。创建一个内核线程池,线程数为零,来一个线程就创建一个SynchronousQueue。
newFixedThreadPool:创建一个固定大小的线程池。被显示的关闭之前,一直存在。底层创建了一个LinkedBlockingQueue
合理利用线程池的好处:
线程池的应用场景
ExecutorService家族图
RejectedExecutionHandler线程丢弃类:
如果线程池中线程已经饱和,那么需要做丢弃处理,RejectedExecutionHandler有四种丢弃策略
线程池核心类ThreadPoolExecutor
(构造方法)
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.acc = System.getSecurityManager() == null ?
null :
AccessController.getContext();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
参数解释:
corePoolSize即是线程池 核心池大小,当线程池中线程的数量超过它时,会将线程放入缓存队列。
maximumPoolSize最大可以创建的线程数,在corePoolSize和maximumPoolSize中的线程会被释放掉。
workQueue阻塞队列,用于存取等待执行的任务。
keepAliveTime线程最大可生存时间(如果线程数量超过corePoolSize)如果调用了allowCoreThreadTimeOut,即使没有超过CorePoolSize超过给定时间也会关闭线程。
threadFactory线程工厂
,