创建线程池

编程入门 行业动态 更新时间:2024-10-25 22:26:10

创建<a href=https://www.elefans.com/category/jswz/34/1771240.html style=线程池"/>

创建线程池

一、Executors创建

(1)通用线程池:newCachedThreadPool();

ExecutorService cachedThreadPool  =  Executors.newCachedThreadPool();

1.线程数无限制

2.有空闲线程则复用空闲线程,若无空闲线程则新建线程

3.一定程度减少频繁创建/销毁线程,减少系统开销

(2)定长线程池:newFixedThreadPool(int corePoolSize);

ExecutorService fixedThreadPool = 
Executors.newFixedThreadPool(int corePoolSize);

1.可控制线程最大并发数(同时执行的线程数 n )

2.超出的线程会在队列中等待

(3)定长定时线程池:newScheduledTreadPool(int corePoolsize);

ScheduledExecutorService scheduledThreadPool = 
Executors.newScheduledThreadPool(int corePoolSize);

1.可控制线程最大并发数(同时执行的线程数)

2.超出的线程会在队列中等待

3.支持定时及周期性任务执行 schedule方法 (Runnable runnable , int t , TimeUnit timeunit)

(4)单线程线程池:newSingleThreadExecutor();

 ExecutorService SingleThreadExecutor = Executors.newSingleThreadExecutor();

1.有且仅有一个工作线程执行任务

2.所有任务按照指定顺序执行,即遵循队列的入队出队规则

(5)单线程定时线程池:newSingleThreadScheduledExecutor();

ScheduledExecutorService SingleThreadScheduledExecutor =
Executors.newSingleThreadScheduledExecutor();

1.有且仅有一个工作线程执行任务

2.所有任务按照指定顺序执行,即遵循队列的入队出队规则

3.支持定时及周期性任务执行 schedule方法 (Runnable runnable , int t , TimeUnit timeunit)

二、自定义创建线程池

ThreadPoolExecutor的参数说明

 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);

corePoolSize核心线程数

maximumPoolSize线程池中的最大线程数

keepAliveTime超过核心线程且少于最大线程的线程的存活时间,过时间回收线程。

unit参数keepAliveTime的时间单位,共7种取值,在TimeUtil中定义 hours,minutes,seconds等

workQueue阻塞队列 如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到该队列当中

threadFactory线程工厂,可以不指定。默认会调用Executors.defaultThreadFactory()创建默认工厂

handler拒绝执行策略。阻塞队列满且超过最大线程数后

四种拒绝策略+自定义拒绝策略

RejectedExecutionHandler handler = 
new ThreadPoolExecutor.AbortPolicy();

AbortPolicy: 丢掉线程后抛异常

(Exception in thread "xxxx"java.util.concurrent.RejectedExecutionException)

DiscardPolicy: 丢掉最后提交的线程

DiscardOldestPolicy: 丢掉最早提交的线程

CallerRunsPolicy: 由交给你该线程的线程执行

自定义需要实现接口RejectedExecutionHandler

RejectedExecutionHandler handler = new RejectedExecutionHandler() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {//新策略:打印日志,重新执行,存入新的队列等}
};

更多推荐

创建线程池

本文发布于:2023-06-13 09:40:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/679090.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:线程

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!