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

创建方式

  • 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创建线程池:

# ThreadPoolExecutor
ExecutorService threadPool = new ThreadPoolExecutor(0, 10,
                60L, TimeUnit.SECONDS,
                new SynchronousQueue<Runnable>());
# Executors
ExecutorService threadPool = Executors.newCachedThreadPool();

手写线程池

    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

Runtime.getRuntime().availableProcessors()+1

2、IO密集型

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余生大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值