高级java每日一道面试题-2024年7月6日

news2024/10/5 1:03:30

面试题:线程池中的RejectedExecutionHandler策略

问题描述
假设你正在设计一个应用,其中使用了ExecutorService线程池来管理任务执行。然而,当线程池和队列都达到饱和状态时,新的任务提交将触发RejectedExecutionHandler。请解释四种默认的RejectedExecutionHandler策略,并实现一种自定义的RejectedExecutionHandler策略,该策略应该在拒绝任务时记录详细的日志信息,并优雅地关闭最老的任务以尝试再次接纳新任务。

解答

四种默认的RejectedExecutionHandler策略
  1. AbortPolicy:抛出RejectedExecutionException异常,这是默认的策略。当线程池无法接受新任务时,此策略会简单地抛出异常,告知调用者无法执行任务。

  2. CallerRunsPolicy:调用者的线程会执行任务。如果线程池已满,那么提交新任务的线程将执行该任务,而不是将其放入队列或等待。这可能导致提交任务的线程阻塞,直到任务完成。

  3. DiscardPolicy:默默丢弃任务而不执行,不抛出异常,也不通知调用者。这种策略适用于可以容忍丢失任务的情况。

  4. DiscardOldestPolicy:丢弃队列中最旧的任务,然后重新尝试执行任务(如果重试仍然失败,则重复此过程)。这意味着最近提交的任务将优先执行,而最旧的任务将被牺牲。

自定义RejectedExecutionHandler实现

下面展示如何实现一个自定义的RejectedExecutionHandler,该策略在拒绝任务时记录日志,并尝试关闭最老的任务以接纳新任务。

import java.util.concurrent.*;
import java.util.logging.Logger;

public class CustomRejectHandler implements RejectedExecutionHandler {

    private static final Logger LOGGER = Logger.getLogger(CustomRejectHandler.class.getName());

    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        // 记录被拒绝任务的日志
        LOGGER.warning("Task " + r.toString() + " rejected due to full thread pool and queue.");

        if (!executor.isShutdown()) {
            // 尝试移除队列中最老的任务
            Runnable oldestTask = null;
            if (!executor.getQueue().isEmpty()) {
                oldestTask = executor.getQueue().poll();
                if (oldestTask != null) {
                    LOGGER.info("Oldest task " + oldestTask.toString() + " removed from queue.");
                }
            }

            // 再次尝试执行新任务
            try {
                executor.execute(r);
            } catch (RejectedExecutionException ree) {
                // 如果再次失败,记录日志并抛出异常
                LOGGER.severe("Failed to execute task after removing the oldest one.");
                throw ree;
            }
        }
    }
}

在这个自定义的策略中,我们首先记录了被拒绝任务的日志信息。接着,如果线程池没有被显式关闭,我们将尝试从任务队列中移除最老的任务,然后再次尝试执行被拒绝的任务。如果再次尝试仍失败,我们将记录更严重的日志信息并抛出异常。

总结:通过这个例子,我们可以看到如何扩展Java并发框架的功能,以适应更复杂的应用场景。自定义RejectedExecutionHandler允许我们根据应用的具体需求来处理线程池饱和时的任务拒绝情况,从而增强应用的健壮性和用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1901179.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端面试题20(防抖函数)

在前端开发中,防抖(debounce)函数是一种常见的优化技术,用于控制函数的执行频率,避免在短时间内重复调用同一函数。这在处理如用户输入、窗口尺寸变化或鼠标移动等高频事件时特别有用,可以显著提升应用程序…

最小权顶点覆盖问题-优先队列分支限界法-C++

问题描述: 给定一个赋权无向图 G(V,E),每个顶点 v∈V 都有一个权值 w(v)。如果 U⊆V,U⊆V,且对任意(u,v)∈E 有 u∈U 或 v∈U,就称 U 为图 G 的一个顶点覆盖。G 的最小权顶点覆盖是指 G 中所含顶点权之和最小的顶点覆盖。对于给定…

AttackGen:一款基于LLM的网络安全事件响应测试工具

关于AttackGen AttackGen是一款功能强大的网络安全事件响应测试工具,该工具利用了大语言模型和MITRE ATT&CK框架的强大功能,并且能够根据研究人员选择的威胁行为组织以及自己组织的详细信息生成定制化的事件响应场景。 功能介绍 1、根据所选的威胁行…

springboot项目多模块工程==1搭建

1、新建父工程 采用springboot工程作为父工程搭建方便依赖选择,在这个基础上进行maven的pom父子模块结构调整。该工程选择mave进行依赖管理 2、springboot 版本及相关依赖选择 3、删除工程目录src,并修改pom 由于该父工程只作为依赖的统一管理,因此将…

Python实战训练(方程与拟合曲线)

1.方程 求e^x-派(3.14)的解 用二分法来求解,先简单算出解所在的区间,然后用迭代法求逼近解,一般不能得到精准的解,所以设置一个能满足自己进度的标准来判断解是否满足 这里打印出解x0是因为在递归过程中…

CentOS 7安装Elasticsearch7.7.0和Kibana

一. 准备安装包 elasticsearch和kibana:官网历史版本找到并下载(https://www.elastic.co/cn/downloads/past-releases#elasticsearch)ik分词器:GitHub下载(https://github.com/infinilabs/analysis-ik/releases/tag/v…

3.js - 裁剪平面(clipIntersection:交集、并集)

看图 代码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js// 导入tween import …

Interpretability 与 Explainability 机器学习

「AI秘籍」系列课程: 人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识 Interpretability 模型和 Explainability 模型之间的区别以及为什么它可能不那么重要 当你第一次深入可解释机器学习领域时,你会…

WEB编程-了解Tomcat服务器

第⼀章⽹络编程 1.1 概述 计算机⽹络:是指将地理位置不同的具有独⽴功能的多台计算机及其外部设备,通过通信线路连接起来,在⽹络 操作系统、⽹络管理软件及⽹络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。 …

cs224n作业3 代码及运行结果

代码里要求用pytorch1.0.0版本,其实不用也可以的。 【删掉run.py里的assert(torch.version “1.0.0”)即可】 代码里面也有提示让你实现什么,弄懂代码什么意思基本就可以了,看多了感觉大框架都大差不差。多看多练慢慢来,加油&am…

前端位置布局汇总

1、位置:绝对位置和相对位置 绝对位置 style"position: absolute;left: 218px;top: 0%;" style"position: absolute;bottom:5px;right:5px ;" 相对位置 :margin外边距 padding内边距 style"border:1px solid black;width:200px;text-ali…

vue事件处理v-on或@

事件处理v-on或 我们可以使用v-on指令(简写)来监听DOM事件,并在事件触发时执行对应的Javascript。用法:v-on:click"methodName"或click"hander" 事件处理器的值可以是: 内敛事件处理器&#xff1…

Yolo v7网络实现细节(一)

Yolo v7网络实现细节 YOLO v7网络架构的整体介绍 不同GPU和对应模型: ​​​​​​​边缘GPU:YOLOv7-tiny普通GPU:YOLOv7​​​​​​​云GPU的基本模型: YOLOv7-W6 激活函数: YOLOv7 tiny: leaky ReLU其…

南方健康2024米思会:科普患教赋能医药增长闭环,千亿蓝海市场大爆发!

2024年6月25日-28日,在中国•南太湖举办的2024米思会如约而至,顺利落下帷幕,本次大会以“韧进启新局”为主题,以不懈进取的“韧劲”,立身破局,迎变启新。通过4天3夜的思想碰撞和互动交流,引领行…

使用shell脚本实现DM8开机自动启动

编写shell脚本 #!/bin/bashsu -dmdba >>EOF cd /home/dmdba/dmdbms/bin ./DmServiceDMTEST start echo "dm start ... " EOF注意:DmServiceDMTEST每个服务器设置的不一样,根据实际进行更换 授权脚本可执行权限 chmod -x /dmdata/dmse…

策略为王股票软件源代码-----如何修改为自己软件61----资讯菜单修改-----举例---------调用同花顺网页------

http://stock.sina.com.cn 将原来的新浪行情,修改为同花顺, 搜索 stock.sina.com.cn... StkUI\View\InfoView.cpp(58):char

【C++:默认成员函数初始化列表】

构造函数 特点 没有返回值支持函数重载对象实例化时,编译器自动调用作用不是构造,而是初始化函数名与类名相同无参函数和全缺省的函数,不用传参就能调用的函数叫做默认构造函数 构造函数是一个特殊的成员函数 注:无参构造函数在实…

Lock4j简单的支持不同方案的高性能分布式锁实现及源码解析

文章目录 1.Lock4j是什么?1.1简介1.2项目地址1.3 我之前手写的分布式锁和限流的实现 2.特性3.如何使用3.1引入相关依赖3.2 配置redis或zookeeper3.3 使用方式3.3.1 注解式自动式3.3.2 手动式 4.源码解析4.1项目目录4.2实现思路 5.总结 1.Lock4j是什么? 1.1简介 lock4j是苞米…

平均102天 Accept的国产医学顶刊,影响因子4连涨,还免版面费!

《Asian Journal of Pharmaceutical Sciences》 (亚洲药物制剂科学) 是由沈阳药科大学主办、Elsevier合作出版的全英文药剂学学术期刊,是“中国科技期刊卓越行动计划”资助期刊,现已被SCIE、PubMed Central、Scopus和DOAJ等国际著名检索系统收录&#xf…

【已解决】“import ... =“ 只能在 TypeScript 文件中使用

现象 在使用 import 语法的时候,代码报红,提示:“import ... “ 只能在 TypeScript 文件中使用 原因 代码被 VSCode 解析成 TypeScript 语法 解决方案: 关闭 JavaScript 的验证启用即可。 mac 快捷方式:comman s…