前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你知道线程池的 创建方式、7大参数、处理流程 和 最大线程数量该如何配置吗

你知道线程池的 创建方式、7大参数、处理流程 和 最大线程数量该如何配置吗

作者头像
余生大大
发布2022-11-02 15:12:05
1.3K0
发布2022-11-02 15:12:05
举报
文章被收录于专栏:余生大大

创建方式

  • Executors.newWorkStealingPool();
    • 创建一个具有抢占式操作的线程池
  • Executors.newScheduledThreadPool(10)
    • 创建一个定长线程池,支持定时及周期性任务执行。
  • Executors.newFixedThreadPool(10)
    • 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  • Executors.newSingleThreadExecutor()
    • 按顺序来执行线程任务   但是不同于单线程,这个线程池只是只能存在一个线程,这个线程死后另外一个线程会补上,继续按顺序执行任务。
  • Executors.newCachedThreadPool()
    • 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。线程池为无限大

7大参数

  • int corePoolSize:核心线程数
  • int maximumPoolSize:最大线程数
  • long keepAliveTime:空闲时间
  • TimeUnit unit:时间单位
  • BlockingQueue<Runnable> workQueue:阻塞队列
  • ThreadFactory threadFactory:线程工厂类
  • RejectedExecutionHandler handler:拒绝策略 

线程池处理流程

拒绝策略

jdk的内置拒绝策略:

创建线程必须使用线程池创建

线程池不允许使用Executors创建,因为线程最大数设置的是Integer.MAX_VALUE = 21E+,无线的创建线程可能造成OOM

使用ThreadPoolExecutor创建线程池:

代码语言:javascript
复制
# ThreadPoolExecutor
ExecutorService threadPool = new ThreadPoolExecutor(0, 10,
                60L, TimeUnit.SECONDS,
                new SynchronousQueue<Runnable>());
# Executors
ExecutorService threadPool = Executors.newCachedThreadPool();

手写线程池

代码语言:javascript
复制
    public static void main(String[] args) {
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,// 线程核心数
                5, // 最大线程数
                1L, // 线程空闲时间
                TimeUnit.SECONDS, // 时间单位
                new LinkedBlockingDeque<Runnable>(3), // 阻塞队列,要设置队列大小,默认是Integer.MAX_VALUE
                Executors.defaultThreadFactory(), // 线程工厂
                new ThreadPoolExecutor.CallerRunsPolicy()); // 拒绝策略

        try {
            for (int i = 0; i < 10; i++) {
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName());
                });
            }
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }

最大线程数量该如何配置

1、CPU密集型

CPU核数+1

代码语言:javascript
复制
Runtime.getRuntime().availableProcessors()+1

2、IO密集型

  • 第一种:由于IO密集型任务线程并不是一支在执行任务则应配置尽可能多的线程,例如CPU核数 * 2
代码语言:javascript
复制
Runtime.getRuntime().availableProcessors() * 2
  • 第二种:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建方式
  • 7大参数
  • 线程池处理流程
  • 拒绝策略
  • 手写线程池
  • 最大线程数量该如何配置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档