java 中如何运用线程池呢?

java-经验王 Java经验 发布时间:2022-04-14 09:29:57 阅读数:6806 1
下文笔者讲述java中创建线程池的方法分享,如下所示:

线程池的简介

线程池顾名思义:就是存放线程的一个池子,我们将待运行的线程放入这个池子中, 由调度器自动调用并运行它
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
---------参数说明--------
corePoolSize:线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
keepAliveTime:线程池维护线程所允许的空闲时间
unit:线程池维护线程所允许的空闲时间的单位
workQueue:线程池所使用的缓冲队列
handler:线程池对拒绝任务的处理策略 

如何向线程池中添加线程

 使用execute(Runnable)方法可将线程添加至线程池中
   当线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
   当线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
   当线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
   当线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务
            也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程 maximumPoolSize,
       如果三者都满了,使用handler处理被拒绝的任务。
   当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数
unitjava.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS

workQueue常用的是:java.util.concurrent.ArrayBlockingQueue

handler有四个选择:
ThreadPoolExecutor.AbortPolicy()
抛出java.util.concurrent.RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy()
重试添加当前的任务,他会自动重复调用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的任务
ThreadPoolExecutor.DiscardPolicy()
抛弃当前的任务 
例:
 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 30, 10, TimeUnit.MILLISECONDS,
                            new ArrayBlockingQueue<Runnable>(weixinAllowDepartments.size()),
                            new ThreadPoolExecutor.CallerRunsPolicy()
                    );

                    //生成单次事件Id 
                    //递归创建线程
                    for (****************) {

                        threadPoolExecutor.execute(new Runnable() {
                            @Override
                            public void run() {
                                //业务代码
                            }
                        });


                    }

                    //停止线程池接收新的任务
                    threadPoolExecutor.shutdown();
                    //等待线程池中所有任务运行完毕,然后调用用户清理
                    while(true) {
                        try {
                            if (!threadPoolExecutor.awaitTermination(2,TimeUnit.SECONDS)) {
                                logger.info("同步用户的线程池正在运行!");
                                if (threadPoolExecutor.isTerminating()) {
                                    logger.warn("同步用户的线程池 ====>未销毁");
                                }
                            }else {
                                break;
                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202204/16499186502863.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者