Java线程池

Java线程池简介及核心概念(一)

一、简介

Java提供的管理线程的工具类(线程管理API)

主要功能:线程调度、复用;控制线程数量。

好处:节省频繁创建线程导致的性能开销。

二、如何使用

  1. 使用JDK自带的线程池

    // 使用JDK中自带的线程池
    ExecutorService service = Executors.newSingleThreadExecutor();
    service.execute(()->{
        // 要执行的逻辑代码
    });
    复制代码

    重点:熟悉系统自带的几种线程池的核心参数及其应用场景(有助于理解自定义线程池)。

  2. 使用自定义线程池

    // 自定义线程池
    ExecutorService customService = new ThreadPoolExecutor(
            0,			     //核心池大小
            Integer.MAX_VALUE,	     //线程池最大容量
            60L,		             //非核心线程池存活时间
            TimeUnit.SECONDS,	     //时间单位
            new SynchronousQueue<>(),    //阻塞队列,用于存放任务
            runnable -> {
                // 线程工厂,常用来给线程池中的线程命名
                Thread thread = new Thread(runnable, "my Thread: ");
                return thread;
            },
            (runnable, threadPoolExecutor) -> {
                // 自定义拒绝策略,当阻塞队列中任务的数量 + 非核心线程数量 > 线程池的最大容量时
                // 会使用该策略拒绝用户的提交请求
            }
    );
    // 提交任务
    customService.execute(()->{
            // 要执行的逻辑代码
    });
    复制代码

    重点:熟悉自定义线程池的核心参数及其意义。

三、基础概念

3.1 核心池大小(corePoolSize)

核心池大小是创建线程池的一项重要指标,当一个新的任务被提交到线程池后,如果此时线程池中运行的线程数 < 核心池大小,那么会直接创建一个核心线程运行该任务。

3.2 线程池最大容量(maximumPoolSize)

线程池最大容量是指当前线程池能容纳的最大线程数,也就是同一时间线程池内最大可以有maximumPoolSize个线程执行任务。当核心线程数 + 非核心线程数 > 线程池最大容量时会触发拒绝策略。

3.3 阻塞队列(BlockQueue)

阻塞队列用于存放用户提交到线程池的任务,在生产者-消费者模型中阻塞队列充当的角色是用于将生产者产生的数据转交到消费者手上,由于阻塞队列可以保证线程安全所以用户可以不用过度关心线程安全问题。

特点:

阻塞队列就像它的名字一样,其最大的特点是阻塞,当队列为空时如果消费者依然发出take请求,那么将会阻塞该次请求,知道队列中插入元素时才会解除阻塞状态;同理,当队列已经满了,生产者产生数据需要放入阻塞队列中时,阻塞队列依然会阻塞这次请求,直到队列有空闲的位置才会解除阻塞状态。

阻塞队列put.png

图3.1 阻塞队列put

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享