使用spring的线程池,在调用线程池时,创建的新线程中获取不到已注入的实例,调用方法时会报空指针异常,比如service业务层的方法。

java线程方法如下

运行后通过debug调试,testManager报空指针

public class TestTask implements Callable {@Autowiredprivate TestManager testManager;public TestTask() {}@Overridepublic Object call() throws Exception {//testManager报错为NullTest test = testManager.selectById("1");return true;}
}

解决方法

方法一 从context中获取bean(SpringBoot实测可行)

将applicationContext作为静态变量,在实现Runnable的接口类中,直接获取静态的applicationContext,从而获取容器下的service实例

public class TestTask implements Callable {@Autowiredprivate TestManager testManager  = SpringContextHolder.getBean("testManager");public TestTask() {}@Overridepublic Object call() throws Exception {Test test = testManager.selectById("1");return true;}
}

方法二 通过参数的形式传入

在调用线程的方法中,直接将service作为参数传入线程中

public class Test {private TestManage testManage;@Resource(name="TaskQueueExecutor")private ThreadPoolTaskExecutor executor;public static void main() {TestTask testTask = new TestTask(testManage);//下面可以忽略FutureTask<Integer> futureTask = new FutureTask<Integer>(testTask);executor.execute(testTask);}
}
public class TestTask implements Callable {private final TestManage testManage;public TestTask(testManage) {//作为参数传入super();this.testManage = testManage;}@Overridepublic Object call() throws Exception {Test test = testManager.selectById("1");return true;}
}

方法三 spring容器的重新扫描(未进行测试)

通过在线程类里面添加静态化代码块,spring容器重新扫描

public class TestTask implements Callable {private static TestManage = testManage;private static ApplicationContext context = null;static{context = new ClassPathXmlApplicationContext("classpath:/spring-context*.xml");testManage = (TestManage) context.getBean("testManage")}public TestTask() {}@Overridepublic Object call() throws Exception {Test test = testManager.selectById("1");return true;}
}

SpringBoot线程池获取service实例空指针相关推荐

  1. C# 线程池和编程实例

    C# 线程池和编程实例 一      线程池可以看做容纳线程的容器:     一个应用程序最多只能有一个线程池:     ThreadPool静态类通过QueueUserWorkItem()方法将工作 ...

  2. 【python爬虫学习记录 持续更新】多线程多进程,带线程池爬取实例

    文章目录 简介 多线程codingFrame 多进程codingFrame 线程池与进程池 线程池爬取实例(主页url隐了 主要看思路 和如何使用线程池框架) 简介 进程是资源单位 线程是执行单位 每 ...

  3. SpringBoot线程池的创建、@Async配置步骤及注意事项

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Muscleheng blog.csdn.net/Muscl ...

  4. SpringBoot线程池ThreadPoolTaskExecutor和@Async异步方法浅解及代码应用示例

    目录 线程池执行顺序 线程池配置策略 Spring线程池的配置类: Spring有.无返回值的异步调用示例 自定义的异步方法类代码: 测试类代码 常见问题: 参考文章: 线程池执行顺序 核心线程数(C ...

  5. SpringBoot 线程池,也太好用了叭!

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/m0_37701381/article/details/81072774 前言 前两天做项目的时候 ...

  6. Springboot线程池的使用和扩展

    我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行,今天我们就来实战体验这个线程池服务: 实 ...

  7. Java线程池原理与实例详解

    Wiki 采用new Thread的方式产生多线程,可能有以下一些问题:  线程的创建和销毁开销很大,尤其是有些线程的存在时间较短:  线程的创建和销毁过程中伴随着CPU在线程间的切换,开销很大: ...

  8. python ping利用线程池获取在线设备

    python ping获取一个VLAN在线设备 myPyPingDevice.py """=== coding: UTF8 ===""" # ...

  9. springboot线程池配置

    1. application.yml配置 # 异步线程配置 # 配置核心线程数 async.executor.thread.core_pool_size: 10 # 配置最大线程数 async.exe ...

  10. Java线程池获取全部完成时的状态并执行后续工作

    Java的几种线程池都没有所有任务完成时的回调方法,也难以获取任务完成的数量: 而很多时候我们都需要在所有任务完成时进行下一步操作: 所以在此我提供一种简便的方法: 首先线程池可以往里面提交任务,我们 ...

最新文章

  1. 虚拟机复制后需要改什么_网站改版后为什么需要每月运营维护?
  2. [转]NLog学习笔记二:深入学习
  3. layui-弹出层中如何关闭窗口
  4. oracle chr()和字符连接
  5. 【Vue2.0】— 组件的自定义事件(十八)
  6. linux怎么测试一个脚本,一个Linux中用于监控的简易shell脚本
  7. Java学习(11-15天, 线性数据结构)
  8. flex向java传递 OBJECT
  9. 袁玉玮:简介人工智能在基金界的应用现状 (二)卖方交易员被冲击
  10. python爬取腾讯vip_用Python批量爬取付费vip数据,竟然如此简单
  11. 从零开始学androidandroid开发环境的搭建.一.
  12. 如何在Windows环境搭建Object C开发环境
  13. (更新至v0.108)termux下载、安装教程 版本v0.88
  14. 说说基因组的垃圾DNA-Transposable elements
  15. Java实现文件搜索
  16. matlab计算程序运行时间
  17. CGB2105-Day-09笔记
  18. ar 华为路由器 端口映射_求教华为AR2200路由器端口映射配置
  19. JAVA基础-字符串
  20. VR用到教育上了?90后怎么就没有赶上呢!

热门文章

  1. 两个星期学会软件测试?我震惊了!
  2. 无人车系统(七):Udacity ‘s无人驾驶仿真环境(社区介绍)
  3. 网站攻击怎么来的,如何攻击?
  4. php杨辉三角的规律,杨辉三角的规律以及定理
  5. 电商系统PC商城模块介绍
  6. 如何在Idea一个窗口打开多个项目
  7. IE8 访问https安全证书错误;导航阻止 解决办法 《转》
  8. 什么是外包公司?要不要去外包公司?
  9. 优动漫PAINT安装教程
  10. python二级考试大纲小学生_Python语言二级考试大纲