线程池及使用场景说明

newFixedThreadPool(固定大小的线程池):

public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads, 
                            0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
 
该线程池特点:

1.核心线程数和最大线程数大小一样

2.keepAliveTime为0

3.阻塞队列使用的是LinkedBlockingQuene(无界队列)

该线程池工作机制:

1.线程数少于核心线程数,新建线程执行任务

2.线程数等于核心线程数时,将任务加到阻塞队列(最大值为Integer.MAX_VALUE),可以一直加加加(可能会出现OOM)

newSingleThreadExecutor(单线程线程池)

 
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, 
TimeUnit.MILLISECONDS, ew LinkedBlockingQueue<Runnable>())); 
}
该线程池特点:

1.核心线程数和最大线程数大小一样且都是1

2.keepAliveTime为0

3.阻塞队列是LinkedBlockingQuene

该线程池工作机制:

1.线程中没有线程时,新建线程执行任务

2有一个线程以后,将任务加到阻塞队列(最大值为Integer.MAX_VALUE),可以一直加加加


#### 该线程池特点:

1.核心线程数为0,且最大线程数为Integer.MAX_VALUE

2.阻塞队列是SynchronousQuene(同步队列)

SynchronousQuene:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量要高于LInkedBlockQuene。

锁当提交任务的速度大于处理任务的速度时,每次提交一个任务,就必然会创建一个线程。极端的情况下会创建过多的线程,耗尽CPU和内存资源。由于空闲60秒的线程会被终止,长时间保持空闲的CachedThreadPool不会占用任何资源。

#### 该线程池工作机制:

1.没有核心线程时,直接向SynchronousQuene中提交任务

2.执行完任务的线程有60秒处理时间

newScheduledThreadPoo

该线程池特点:

1.最大线程数为Integer.MAX_VALUE

2.阻塞队列是DelayedWorkQuene(延迟队列)

DelayedWorkQuene中封装了一个优先级队列,这个队列会对队列中的ScheduleFutureTask进行排序,两个任务的执行Time不同时,time小的先执行; 否则比较添加队列中的ScheduledFutureTask的顺序号sequenceNumber,先提交的先执行。

API

ScheduledThreadPoolExecutor添加任务提供了另外两个方法:

1.scheduleAtFixedRate():按某种速率周期执行

2.scheduleWithFixedDelay():在某个延迟后执行

两种方法的内部实现都是创建了一个ScheduledFutureTask对象封装了任务的延迟执行时间及执行周期,并调用decorateTask()方法转成RunnableScheduledFuture对象,然后添加到队列中。

该线程池工作机制:

1.调用上面两个方法添加一个任务

2.线程池中的线程从DelayQuene中取任务

3.然后执行任务

原文链接:线程池及使用场景说明 - 掘金 (juejin.cn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值