线程池的7种创建方式,强烈推荐你用它...(7)

简介: 线程池的7种创建方式,强烈推荐你用它...(7)

线程拒绝策略


我们来演示一下 ThreadPoolExecutor 的拒绝策略的触发,我们使用 DiscardPolicy  的拒绝策略,它会忽略并抛弃当前任务的策略,实现代码如下:


public static void main(String[] args) {
    // 任务的具体方法
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("当前任务被执行,执行时间:" + new Date() +
                               " 执行线程:" + Thread.currentThread().getName());
            try {
                // 等待 1s
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    // 创建线程,线程的任务队列的长度为 1
    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1,
                                                           100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1),
                                                           new ThreadPoolExecutor.DiscardPolicy());
    // 添加并执行 4 个任务
    threadPool.execute(runnable);
    threadPool.execute(runnable);
    threadPool.execute(runnable);
    threadPool.execute(runnable);
}


我们创建了一个核心线程数和最大线程数都为 1 的线程池,并且给线程池的任务队列设置为 1,这样当我们有 2 个以上的任务时就会触发拒绝策略,执行的结果如下图所示:


微信图片_20220120150121.jpg


从上述结果可以看出只有两个任务被正确执行了,其他多余的任务就被舍弃并忽略了。其他拒绝策略的使用类似,这里就不一一赘述了。


自定义拒绝策略


除了 Java 自身提供的 4 种拒绝策略之外,我们也可以自定义拒绝策略,示例代码如下:


public static void main(String[] args) {
    // 任务的具体方法
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("当前任务被执行,执行时间:" + new Date() +
                               " 执行线程:" + Thread.currentThread().getName());
            try {
                // 等待 1s
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    // 创建线程,线程的任务队列的长度为 1
    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1,
                                                           100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1),
                                                           new RejectedExecutionHandler() {
                                                               @Override
                                                               public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                                                                   // 执行自定义拒绝策略的相关操作
                                                                   System.out.println("我是自定义拒绝策略~");
                                                               }
                                                           });
    // 添加并执行 4 个任务
    threadPool.execute(runnable);
    threadPool.execute(runnable);
    threadPool.execute(runnable);
    threadPool.execute(runnable);
}


程序的执行结果如下:


微信图片_20220120150153.jpg


相关文章
|
机器学习/深度学习 编译器 C++
C++模板元模板实战书籍讲解第一章(顺序、分支与循环代码的编写)--前篇
C++模板元模板实战书籍讲解第一章(顺序、分支与循环代码的编写)--前篇
69 0
|
存储 算法 C++
【C++杂货铺】优先级队列的使用指南与模拟实现
【C++杂货铺】优先级队列的使用指南与模拟实现
64 0
|
存储 前端开发 Java
二十三.SpringCloudConfig源码-初始化配置
今天这篇文章我们来分析一下Spring Cloud Config 配置中心的源码,这应该是Spring Cloud Netflix的源码分析的最后一篇。下一个系列我将会继续分析Spring Cloud Alibaba相关组件的源码。Spring Cloud Config 基础使用请移步 《[配置中心Spring Cloud Config](https://blog.csdn.net/u014494148/article/details/117253831)》
|
缓存 并行计算 算法
【CUDA学习笔记】第四篇:线程以及线程同步(附案例代码下载方式)(二)
【CUDA学习笔记】第四篇:线程以及线程同步(附案例代码下载方式)(二)
386 0
|
存储 缓存 并行计算
【CUDA学习笔记】第四篇:线程以及线程同步(附案例代码下载方式)(一)
【CUDA学习笔记】第四篇:线程以及线程同步(附案例代码下载方式)(一)
621 0
|
Java
并发编程(十一)自定义线程池
并发编程(十一)自定义线程池
105 0
|
Java 数据库
Java线程池的简单使用
对于资源池的技术,相信大家早就接触过,比如数据库连接池,常见的有c3p0、dbcp等等,而线程也有对应的池子,称为线程池。
158 0
Java线程池的简单使用
|
Java 程序员 开发者
|
缓存 Java
线程池的7种创建方式,强烈推荐你用它...(2)
线程池的7种创建方式,强烈推荐你用它...(2)
112 0
线程池的7种创建方式,强烈推荐你用它...(2)
|
Java
线程池的7种创建方式,强烈推荐你用它...(3)
线程池的7种创建方式,强烈推荐你用它...(3)
122 0
线程池的7种创建方式,强烈推荐你用它...(3)