线程池+枚举+反射调用不同接口获得统一返回数值

2023-11-06

首先接口函数的定义:使用策略模式,不同的接口实现类统一实现一个被实现的接口类

public interface ThreadServiceBase {
    /**
     *
     * 用来被继承使用
     */
}

然后不同的接口实现类都实现这个接口,每个实现类有自己的定义业务接口,例如

接口定义好后,定义枚举类,枚举类有两种模式,

THREADTHREE("threadThree",new ThreadThreeServiceImpl()),
THREADONE("threadOne",new ThreadServiceImpl());

or
THREADTHREE("threadThree", "ThreadThreeServiceImpl"),
THREADONE("threadOne", "ThreadServiceImpl");

l分别对应的线程的处理方式如下:

// 这里使用的是枚举类中new对象后直接调用的方式

public class ThreadPoolInterfaceInvoke implements Callable<Pair<Integer, Integer>> {
    private static final Logger logger = LoggerFactory.getLogger(ThreadPoolInterfaceInvoke.class);

    /*开发思路:一个线程只能调用一次,外部使用线程池过来调用,所以这里需要配备四个接口的调用参数。
     * 用到了  线程  参数传递  枚举  反射*/
    private String v;

    /**
     *
     */
    private Pair<Integer, Integer> pairThreadLocal;

    public ThreadPoolInterfaceInvoke(){}
    public ThreadPoolInterfaceInvoke(String v){
        this.v = v;
    }

    @Override
    public Pair<Integer, Integer> call() throws Exception {
        ThreadService threadService = (ThreadService)ThreadEnum.get(v).getServiceClass();
        int threadOne = threadService.threadOne();
        logger.info("threadOne name v:{}, threadOne value:{}",v,threadOne);
        int threadTwo = threadService.threadTwo();
        logger.info("threadTwo name v:{}, threadTwo value:{}",v,threadTwo);
        pairThreadLocal = new Pair<Integer, Integer>(threadOne,threadTwo);
        return pairThreadLocal;
    }
}

// 这种方式是通过,反射原理从spring工厂获取bean在调用方法

public class ThreadPoolInterfaceInvokeTwo implements Callable<Pair<Integer, Integer>> {
    private static final Logger logger = LoggerFactory.getLogger(ThreadPoolInterfaceInvokeTwo.class);

    /*开发思路:一个线程只能调用一次,外部使用线程池过来调用,所以这里需要配备四个接口的调用参数。
     * 用到了  线程  参数传递  枚举  反射*/
    private String v;

    /**
     * 
     */
    private Pair<Integer, Integer> pairThreadLocal;

    public ThreadPoolInterfaceInvokeTwo(String v){
        this.v = v;
    }

    @Override
    public Pair<Integer, Integer> call() throws Exception {
        // 枚举获得 类名称  或则  获得类.class
        String serviceClass = ThreadEnumTwo.get(v).getServiceClass();
        // 根据类名 或者.class获得反射类  
        // 这里需注意,如果是name的方式需要在@Service("ThreadThreeServiceImpl")注明,否则spring工厂找不到bean,当然也可以直接使用.class的方式。后续贴出代码,这里不展示
        ThreadServiceBase bean = (ThreadServiceBase) SpringContextUtil.getBean(serviceClass);
        Class<? extends ThreadServiceBase> aClass = bean.getClass();
        // 获取方法  这里的方法名需要不同接口实现时使用相同的方法名
        Method threadOne = aClass.getMethod("threadOne", null);
        // 调用方法
        int invokeOne = (int)threadOne.invoke(aClass.newInstance(), null);

        Method threadTwo = aClass.getMethod("threadTwo", null);
        int invokeTwo = (int)threadTwo.invoke(aClass.newInstance(), null);

        logger.info("invokeOne name v:{}, invokeOne value:{}",v,threadOne);
        logger.info("invokeTwo name v:{}, invokeTwo value:{}",v,threadTwo);
        pairThreadLocal = new Pair<Integer, Integer>(invokeOne,invokeTwo);
        return pairThreadLocal;
    }
}

 

线程写好后,下一步是定义线程池。这里就不作赘述。

// 这里只贴出了上面的一种方式,其实两个都差不多。

// 我这里使用的springboot中自带的schdule方式,可以自行选择其他定时任务,quatz, xx_job,eslate_job,timer等都一样使用代码逻辑

@Async//此注解是config中的线程池使用定时任务。
@Component
public class ScheduleThradInterfaceTwo {
    private static final org.slf4j.Logger log = LoggerFactory.getLogger(ScheduleThradInterfaceTwo.class);

    @Scheduled(cron = "0 0/1 * * * ?")
    public void scheduled() throws Exception{
        log.info("ScheduleThradInterfaceTwo---------------------");
        // 固定大小线程池的使用
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                                 2,                             //核心线程池大小
                                 Runtime.getRuntime().availableProcessors(),   //最大核心线程池大小(CPU密集型,根据CPU核数设置)
                                 3,                         //超时了没有人调用就会释放
                                 TimeUnit.SECONDS,                             //超时单位
                                 new LinkedBlockingDeque<>(3),                 //阻塞队列
                                 Executors.defaultThreadFactory(),             //线程工厂,创建线程的,一般不用动
                                 new ThreadPoolExecutor.AbortPolicy());
        // 使用多线程  lsit 一起调用
        List<ThreadPoolInterfaceInvokeTwo> list = Arrays.asList(
                new ThreadPoolInterfaceInvokeTwo(ThreadEnum.THREADTHREE.getServiceName()),
                new ThreadPoolInterfaceInvokeTwo(ThreadEnum.THREADONE.getServiceName()));

        List<Future<Pair<Integer, Integer>>> futures = null;
        try {
            futures = threadPool.invokeAll(list);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        List<Integer> integers = new ArrayList<>();
// 待结果统一返回后,整理结果集
        futures.stream().forEach( fu -> {
            try {
                Pair<Integer, Integer> integerIntegerPair = fu.get();
                integers.add(integerIntegerPair.getKey());
                integers.add(integerIntegerPair.getValue());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        });


        log.info("ScheduleThradInterfaceTwo输出结果---------------------------------------------------------------------:"+integers.toString());




    }
}

springContexUtils如下:

@Component
public class SpringContextUtil implements ApplicationContextAware {

    public static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    public ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String name) {
        return applicationContext.getBean(name);
    }

    public <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }

    public <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程池+枚举+反射调用不同接口获得统一返回数值 的相关文章

  • Java:迭代 Collection 的最佳方法(此处为 ArrayList)

    今天 当我看到一段我已经使用了数百次的代码时 我很高兴地开始编码 迭代集合 此处为 ArrayList 出于某种原因 我实际上查看了 Eclipse 的自动完成选项 这让我想知道 在什么情况下以下循环比其他循环更好使用 经典的数组索引循环
  • SAML 服务提供商 Spring Security

    当使用预先配置的服务提供者元数据时 在 Spring Security 中 是否应该有 2 个用于扩展元数据委托的 bean 定义 一份用于 IDP 元数据 一份用于 SP 元数据
  • 如何使用 Java 处理 Selenium WebDriver 中的新窗口?

    这是我的代码 driver findElement By id ImageButton5 click Thread sleep 3000 String winHandleBefore driver getWindowHandle drive
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • java中如何连接字符串

    这是我的字符串连接代码 StringSecret java public class StringSecret public static void main String args String s new String abc s co
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 在 S3 中迭代对象时出现“ConnectionPoolTimeoutException”

    我已经使用 aws java API 一段时间了 没有遇到太多问题 目前我使用的是库 1 5 2 版本 当我使用以下代码迭代文件夹内的对象时 AmazonS3 s3 new AmazonS3Client new PropertiesCred
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • 匿名类上的 NotSerializedException

    我有一个用于过滤项目的界面 public interface KeyValFilter extends Serializable public static final long serialVersionUID 7069537470113
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • 如何在 Java 中测试一个类是否正确实现了 Serialized(不仅仅是 Serialized 的实例)

    我正在实现一个可序列化的类 因此它是一个与 RMI 一起使用的值对象 但我需要测试一下 有没有办法轻松做到这一点 澄清 我正在实现该类 因此在类定义中添加 Serialized 很简单 我需要手动序列化 反序列化它以查看它是否有效 我找到了
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • Struts 2 + Sitemesh 3 集成 - FreemarkerDecoratorServlet 中的 NPE

    我将 Struts 2 版本 2 3 14 3 与 Sitemesh 3 版本 3 0 alpha 2 一起使用 并且在某些情况下遇到 NullPointerException 首先 这是我的 web xml 中的 struts2 site
  • 考虑在配置中定义“org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder”类型的 bean

    我正在尝试将 jwt 令牌连接到我的项目 但在工作过程中遇到了一些问题 我已按照上述说明进行操作here https auth0 com blog implementing jwt authentication on spring boot
  • Netty:阻止调用以获取连接的服务器通道?

    呼吁ServerBootstrap bind 返回一个Channel但这不是在Connected状态 因此不能用于写入客户端 Netty 文档中的所有示例都显示写入Channel从它的ChannelHandler的事件如channelCon
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话

随机推荐

  • 写一个查找表和数组的算法

    写一个查找表和数组的算法 查找有无一般使用set数据结构 查找对应关系使用Map映射数据结构 给定两个数组nums1 1 2 2 1 num2 2 2 求两个数组的公共元素 结果为 2 将一个集合中的元素存入set集合中 然后从另一个集合中
  • DataView的用法

    转载 http www 360doc com content 14 0422 15 19147 371133095 shtml DataView就是表示用于排序 筛选 搜索 编辑个导航的DataTable的可绑定数据的自定义视图 DataV
  • BES2300x笔记(33) -- 通话音量、回声与降噪调试

    哈喽大家好 这是该系列博文的第三十三篇 篇 lt lt 系列博文索引 快速通道 gt gt 通话算法调试指南下载 一 前言 一次心血来潮 使用正在开发的蓝牙耳机跟朋友交流感情 正说着 朋友吐槽我吐字不清晰 声音又小 没一点子诚意 W T 我
  • 第19讲 建立玻璃幕墙

    这里主要是进行了玻璃的 prop的glass和corner
  • flutter iOS 屏蔽黑暗模式

    前言 因为项目没有考虑到适配黑暗模式的场景 所以为了避免出现各种各样奇葩的问题 我们是建议把黑暗模式关闭 这样加能解决许多的bug 一 flutter层面设置 override Widget build BuildContext conte
  • OSError: /usr/local/lib/python3.7/dist-packages/torchtext/_torchtext.so: undefined symbol: _ZNK3c10

    本文目录 运行截图 解决 1 查找torch1 7对应torchtext版本 2 安装torchtext 3 重启kernel 参考资料 说明 在Colab上跑模型报错 其中torch版本1 7 运行截图 报错信息如下 Traceback
  • Failed to bind properties under ‘spring.datasource.type’ to java.lang.Class的解决方法

    Failed to bind properties under spring datasource type to java lang Class
  • STM32 usb 设备实现自动重枚举

    在开发USB设备时可能会经常遇到烧录程序后要重新拔插USB接口才能使USB设备正常工作 原因是因为重新烧录后 PC没有对USB设备进行重枚举 导致无法正常工作 解决方法很简单 我们只要在程序启动后第一时间对USB接口的DP引脚进行一下拉低操
  • Web自动化Selenium-JavaScript的应用

    JavaScript是Web页面的编程语言 Selenium提供了execute script方法 用来执行JavaScript 从而完成一些特殊的操作 操作页面元素 我们可以借助JavaScript操作页面元素 如在搜索框中输入文字 单击
  • Sublime text3 Version 3.22下载安装及注册

    文章目录 前言 一 下载Sublime Text 3 1 本机系统配置 Windows10 64位 2 下载链接 3 安装 二 注册 3步走 1 修改hosts文件 2 修改编辑 sunlime text exe 3 注册 三 参考文章 前
  • c++SQLite

    SQLite C 操作类 转载于 http blog csdn net chinamming article details 17049575 0 tsina 1 1347 397232819ff9a47a7b7e80a40613cfe1
  • 【前端部署】vue项目打包并部署到Linux服务器

    文章目录 一 打包vue前端项目 二 安装nginx 1 下载及安装 2 启动程序 3 其他命令 三 利用WinSCP传输文件 四 配置nginx 1 修改服务器端口 2 修改dist存放路径 3 完整配置文件 五 进入界面和项目更新 1
  • office2021专业增强版,使用kms命令行激活

    以管理员身份运行cmd 注意 必须以管理员身份运行 分别输入以下命令 cd C Program Files Microsoft Office Office16 cscript ospp vbs sethst kms 0t net cn cs
  • sqli-labs通关全解---有关过滤的绕过--less23,25~28,32~37--8

    preg replace 参数 作用 pattern 正则表达式或者要匹配的内容 replacement 要替换的内容 subject 要操作的对象 preg replace 用于sql注入防护中 主要是将一些疑似攻击的代码进行替换处理 从
  • python 获取毫秒级时间问题

    根据网上的一些说法 在python里获取ms级系统时间可以通过以下方式获取 import datetime print datetime datetime now microsecond 但通过以下代码测试 发现返回的并不是ms的值 而是u
  • 适用于Windows 10开发人员的Hyper-V

    Microsoft Hyper V codenamed Viridian is a native type 1 hypervisor that directly runs on the hardware compared to VMware
  • 2023年无人航空系统与航空航天国际会议(ICUASA 2023)

    2023年无人航空系统与航空航天国际会议 ICUASA 2023 重要信息 会议网址 www icuasa org 会议时间 2023年2月18 20日 召开地点 中国广州 截稿时间 2023年12月30日 录用通知 投稿后2周内 收录检索
  • numpy、pandas实用总结(3种数据合并)

    前言 将俩个或者多个DataFrame合并在一起 这样的操作在日常工作中是极为频繁的一件事情 目前 我所知的有四种将DataFrame合并在一起 的方法 concat 在Series中也可以使用 merge join concat合并 这种
  • hdu 1438 钥匙计数之一

    Problem acm hdu edu cn showproblem php pid 1438 Reference blog csdn net u010405898 article details 9530769 blog csdn net
  • 线程池+枚举+反射调用不同接口获得统一返回数值

    首先接口函数的定义 使用策略模式 不同的接口实现类统一实现一个被实现的接口类 public interface ThreadServiceBase 用来被继承使用 然后不同的接口实现类都实现这个接口 每个实现类有自己的定义业务接口 例如 接