线程池及使用场景说明

2022-10-09 12:11:14 浏览数 (2)

theme: condensed-night-purple

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

代码语言:javascript复制
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(单线程线程池)

代码语言:javascript复制
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),可以一直加加加

代码语言:javascript复制
#### 该线程池特点:

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.然后执行任务

0 人点赞