线程池的创建的使用

在并发量较高的项目中,我们往往会涉及到线程的创建与销毁的问题,由于线程的创建和销毁是很消耗我们的性能的,所以我们会在项目中引进线程池,来让我们的线程可以循环的使用,避免不停的去创建销毁线程。

线程的创建
ThreadPoolExecutor statsThreadPool = new ThreadPoolExecutor(
                10, 10, 0L,
                TimeUnit.MILLISECONDS,
                new LinkedBlockingDeque<>(200), new ThreadFactoryBuilder().build());
参数分析
int corePoolSize: 核心线程池大小,注意在刚创建的时候线程池中的数量是为0的,当又任务来的时候就开始创建线程去执行,直到线程的数量到达corePoolSize大小,超过的任务会被放到缓存队列中去。 int maximumPoolSize: 最大线程数量。 long keepAliveTime: 超过核心线程池数量的其他线程的保存时间。 keepAliveTime: 时间的单位。 BlockingQueue workQueue: 保存任务的队列。 ThreadFactory threadFactory: 创建线程的工厂。

Executors创建线程池

//创建固定数量的线程池
1. public static ExecutorService newFixedThreadPool(int nThreads)
//创建单个线程池
2. public static ExecutorService newSingleThreadExecutor()
//创建核心线程数为0的线程
3. public static ExecutorService newCachedThreadPool();

注意:当服务器资源有限时,使用newFixedThreadPool和newSingleThreadExecutor创建的线程池他的queue队列的长度是Integer.MAX_VALUE,用newCachedThreadPool创建的线程池时,他是可以创建Integer.MAX_VALUE个线程的,都会出现OOM异常。所有不是很建议大家使用,特别是在并发量大的场景中。

queue队列机制
  1. ArrayBlockingQueue: 基于数组实现,FIFO(先入先出)队列
  2. LinkedBlockingQueue: 基于链表实现,FIFO(先入先出)队列
  3. 当核心线程池的数量和最大线程数都是最大值时,就会拒绝其他的任务加入。
线程的执行和线程池的关闭
  1. 线程执行:在使用ThreadPoolExecutor线程池时,execute()方法和submit()方法都是可以执行任务的。其中submit()方法最终也是调用的是父类的execute()方法进行执行任务。
  2. 线程池的关闭:shutdown()方法是拒绝新的任务加入,正在执行的任务和队列中的任务会继续执行完。shutdownNow()拒绝所有新的任务加入,并且会关闭正在执行的任务且清空队列中的任务。

总结:线程池在很大层面上是提升了系统的性能,大大减少了创建和销毁线程的开销,但是大家要注意的是我们也需要合理的配置线程池中的参数。配置大了有点浪费,但配置过小性能又会差,所有需要自己多多调整自己的参数进行配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值