java 多线程 线程池

java 多线程 线程池

  • ThreadPoolExecutor
  • AbstractExecutorService
  • ExecutorService
  • Executor

以上就是多线程核心的4个类

他们的关系 ThreadPoolExecutor extends AbstractExecutorService implements ExecutorService implements Executor

最终是由Executor execute()执行线程

创建线程池 有两种方式

第一种方式

newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

这种方式就是可以自己选择自己需求的线程池使用

第二种方式

直接 使用最最上面一层 ThreadPoolExecutor 进行线程池创建
他的使用 有点像 newFixedThreadPool 也是创建定长的线程池,控制最大处理线程数,超出线程放在队列等待

下面只介绍第二种方式,第一种方式可以自行 google和baidu


ThreadPoolExecutor

  • ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, BlockingQueue)
  • ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, BlockingQueue, ThreadFactory)
  • ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, BlockingQueue, RejectedExecutionHandler)
  • ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, BlockingQueue , ThreadFactory, RejectedExecutionHandler)

参数

上面就是官方ThreadPoolExecutor所有构造方法

参数解析
corePoolSize设置同时处理最大的线程核数
maximumPoolSize设置线程池最大的线程总数
keepAliveTime设置允许空余线程存活的时间
unit时间单位
BlockingQueue设置储存队列
ThreadFactory设置线程工厂设置 线程各种属性
RejectedExecutionHandler这个属性当存储队列满了,最大线程数满载的时候,还有新增的线程就是报错触发这个方法进行相应的处理

这个几个参数的意思

corePoolSize = 5 同时最大处理的线程数, 如果同时进来4个线程, 那么 4 < 5这个时候就可以同时将这个4个线程同时处理,那么就是还有一个空闲线程,如果再进来一个新线程,程序还是会加进 线程池里面处理,这个时候就是线程池处理最大的 并发数了 , 要是这个时候 再进来一个新线程,这个时候就是 设置BlockingQueue储存队列了,如果有设置长度为 5 那么就是说明储存队列 只能储存5个新线程,那么就把新线程加到队列里面 ,当前面的线程处理完就会从储存队列里面提取线程进行处理,如果没有设置长度,默认是Integer.MAX_VALUE就是最大,这种情况就不说了。当储存队列已经满了,再进来一个新的线程,这个时候怎么办, 这个时候设置 maximumPoolSize = 5,设置最大处理的线程总数,他的效果就是当储存队列满了,才会去激活 去处理新进来的线程 , 如果maximumPoolSize线程也已经满载了, 就是说默认线程数 满了,队列满了,最大线程数也满了,这个时候程序会触发RejectedExecutionHandler接口rejectedExecution方法,这个进行异常处理,如果没有配置这个方法,程序就是出现错误异常
,以上的流程就是线程池 处理的流程

看不懂文字看看下面简单的流程图
这里写图片描述

那么keepAliveTime 这个参数是什么意思呢

when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating
这个是官方的解释
意思就是 当前的开启总线程数量 > 核数线程数量 那么多余的空闲线程存活时间 ,这个什么意思呢
总线程 10 > 核数线程 5 ,keepAliveTime = 5s 那么空闲的剩下5个线程就在 5s 后进行回收 ,

讲 了这么多 直接上代码

代码块

public static void main(String[] args) {
        //创建线程池  核数线程5  最大总线程 10  线程存活时间 10s 缓存队列 5
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 7, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>(2), new MyThreadFactory() , new MyRejectedExecutionHandler());

        for (int i = 0; i < 10; i++)
            //处理线程
            threadPoolExecutor.execute(new MyRunnable(i));

        System.out.println("核心线程数:" + threadPoolExecutor.getCorePoolSize());
        System.out.println("线程数总数:" + threadPoolExecutor.getMaximumPoolSize());
        System.out.println("队列线程数:" + threadPoolExecutor.getQueue().size());
        System.out.println("当前活动线程数:" + threadPoolExecutor.getActiveCount());
    }


   static class MyRunnable implements Runnable {
        int flag = 0;
        public MyRunnable(int flag) {
            this.flag = flag;
        }

        @Override
        public void run() {
            System.out.println("开始运行线程:" + flag);
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                System.out.println("线程终止:" + flag);
            }
            System.out.println("运行结束:" + flag);
        }
    }

    static class MyRejectedExecutionHandler implements RejectedExecutionHandler{


        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            System.out.println("处理已满");
        }
    }

    static class MyThreadFactory implements ThreadFactory {

        @Override
        public Thread newThread(Runnable r) {
            return new Thread(r);
        }
    }

运行结果

处理已满
开始运行线程:7
开始运行线程:4
开始运行线程:1
开始运行线程:8
开始运行线程:6
核心线程数:2
开始运行线程:5
开始运行线程:0
线程数总数:7
队列线程数:2
当前活动线程数:7

运行结束:6
运行结束:7
运行结束:0
运行结束:1
运行结束:5
运行结束:4
开始运行线程:3
开始运行线程:2
运行结束:8
运行结束:3
运行结束:2

程序首先出 0和1线程 之后 将2和3加缓存队列 之后4 , 5 , 6 , 7 , 8 , 9 线程开启到之后线程数量 , 剩下10没有打印就是因为触发RejectedExecutionHandler异常 ,

以上就是我个人对 ThreadPoolExecutor 一些见解,

欢迎转载,谢谢!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java线线程池是一种重用线程的机制,它可以管理和调度多个线程来执行任务。使用线程池可以提高程序的性能和效率,同时也可以避免线程的频繁创建和销毁。 在Java中,可以使用线程池类ExecutorService和Executors来创建和管理线程池。具体步骤如下: 1. 创建一个线程池对象:可以使用Executors提供的静态方法创建不同类型的线程池,比如newFixedThreadPool固定大小线程池、newCachedThreadPool缓存线程池等。 2. 向线程池提交任务:使用submit方法向线程池提交需要执行的任务,也可以使用execute方法提交任务。任务可以是实现了Runnable接口或Callable接口的类,也可以是Lambda表达式。 3. 线程池执行任务:线程池会根据线程池的规模和任务的数量来调度和执行任务,多个任务会并发执行。 4. 关闭线程池:当不再需要线程池时,可以调用线程池的shutdown方法来关闭线程池,确保所有的任务都被执行完毕。 使用线程池的好处有: 1. 提高性能:线程池可以重用线程,避免线程频繁创建和销毁的开销,提高程序的性能。 2. 提供线程管理和调度:线程池可以管理和调度线程,根据线程池的规模和任务的数量来调度和执行任务。 3. 控制资源的使用:线程池可以限制并发线程的数量,避免过度占用系统资源。 在Java开发中,使用线程池是一种推荐的多线程编程方式,也是阿里巴巴在其《Java开发手册》中强制规定的做法。 Java线程的创建是依赖于系统内核的,通过JVM调用系统库创建内核线程,内核线程与Java Thread是1:1的映射关系。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Java线程(六):线程池详解](https://blog.csdn.net/m0_59140023/article/details/124436385)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [java线程和线程池](https://blog.csdn.net/qq_29996285/article/details/118955325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值