java 自定义线程池及参数怎么设置?
Posted 派大星敲代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 自定义线程池及参数怎么设置?相关的知识,希望对你有一定的参考价值。
我们如何自定义一个线程池?线程池的参数怎么设置?
废话不多说直接上代码
int cpuNum = Runtime.getRuntime().availableProcessors();
//线程大小:这一点要看我们执行的任务是cpu密集型,还是io密集型
//如果有关于计算机计算,比较消耗资源的是cpu密集型,线程大小应该设置为cpu核数+1
//如果有关网络传输,连接数据库等,是io密集型,线程大小应该设置为cpu*2
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10,
2 * cpuNum,
3, TimeUnit.SECONDS,
new LinkedBlockingDeque<Runnable>(10),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
try
for (int i = 0; i < 9; i++)
threadPoolExecutor.execute(new ThreadDemo(i));
catch (Exception e)
e.printStackTrace();
finally
threadPoolExecutor.shutdown();
threadPoolExecutor.execute(new ThreadDemo(i));
这串代码是创建了一个任务并且提交给了线程池
这是我的任务类
public class ThreadDemo implements Runnable
private int i;
public ThreadDemo(int i)
this.i = i;
@Override
public void run()
System.out.println(Thread.currentThread().getName()+i);
继承runnable实现run方法
需要注意的是在任务类里面,使用注解注入bean是不生效的,所以需要通过构造函数来注入
当我们创建一个线程池,开始的时候线程池里面一个线程也没有,随着任务的提交,而创建线程,当当前的线程数小于最大线程数的时候,继续创建线程,如果大于最大线程数,就放进阻塞队列里面,如果队列满了则触发拒绝策略;
线程池参数有哪些,分别是干什么的
corePoolSize:线程大小,这个参数根据我们的任务数去设置的
maximumPoolSize:最大线程数,这个一般我们根据机器的cpu核数和我们任务是io密集型或cpu密集型去设置的
java获取cpu核数的方法是Runtime.getRuntime().availableProcessors();
cpu密集型就是任务里是cpu计算比较消耗cpu资源的这种的我们最大线程数一般设置为cpu核数+1
io密集型就是任务里是网络传输,连接数据库等一些ios操作的,我们一般设置最大线程数是2*cpu核数
keepAliveTime:第三个参数是当线程没有任务的时候最大的保留时间超出这个时间,这个线程就被终止了
unit:第四个参数是keepAliveTime的时间单位
workQueue:第五个参数是存储执行任务的队列,当到达最大线程数,就会把任务放在队列里面
threadFactory:第六个参数是线程工程
handler:最后一个参数拒绝策略,当队列也满了的时候就会出发拒绝策略
感谢阅读,不当之处,还望海涵
以上是关于java 自定义线程池及参数怎么设置?的主要内容,如果未能解决你的问题,请参考以下文章
Java ExecutorService四种线程池及自定义ThreadPoolExecutor机制
Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用