如何在运行主方法的同时异步运行另一个方法,我是用来更新缓存;

1. 工具类

  1. public class ThreadPoolUtils {
  2. private static final Logger LOGGER = LoggerFactory.getLogger(ThreadPoolUtils.class);
  3. private static final String POOL_NAME = "thread-im-runner";
  4. // 等待队列长度
  5. private static final int BLOCKING_QUEUE_LENGTH = 20000;
  6. // 闲置线程存活时间
  7. private static final int KEEP_ALIVE_TIME = 5 * 1000;
  8. private static ThreadPoolExecutor threadPool = null;
  9.  
  10. private ThreadPoolUtils() {
  11. throw new IllegalStateException("utility class");
  12. }
  13.  
  14. /**
  15. * 无返回值直接执行
  16. *
  17. * @param runnable 需要运行的任务
  18. */
  19. public static void execute(Runnable runnable) {
  20. getThreadPool().execute(runnable);
  21. }
  22.  
  23. /**
  24. * 有返回值执行 主线程中使用Future.get()获取返回值时,会阻塞主线程,直到任务执行完毕
  25. *
  26. * @param callable 需要运行的任务
  27. */
  28. public static <T> Future<T> submit(Callable<T> callable) {
  29. return getThreadPool().submit(callable);
  30. }
  31.  
  32. private static synchronized ThreadPoolExecutor getThreadPool() {
  33. if (threadPool == null) {
  34. // 核心线程数、最大线程数、闲置线程存活时间、时间单位、线程队列、线程工厂、当前线程数已经超过最大线程数时的异常处理策略
  35. threadPool = new ThreadPoolExecutor(50, 500, KEEP_ALIVE_TIME, TimeUnit.MILLISECONDS,
  36. new ArrayBlockingQueue<>(BLOCKING_QUEUE_LENGTH),
  37. new ThreadFactoryBuilder().setNameFormat(POOL_NAME + "-%d").build(),
  38. new ThreadPoolExecutor.AbortPolicy() {
  39. @Override
  40. public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
  41. LOGGER.warn("线程过多,当前运行线程总数:{},活动线程数:{}。等待队列已满,等待运行任务数:{}", e.getPoolSize(), e.getActiveCount(),
  42. e.getQueue().size());
  43. }
  44. });
  45. }
  46. return threadPool;
  47. }
  48.  
  49. private static synchronized ThreadPoolExecutor getThreadPoolByCpuNum() {
  50. if (threadPool == null) {
  51. // 获取处理器数量
  52. int cpuNum = Runtime.getRuntime().availableProcessors();
  53. // 根据cpu数量,计算出合理的线程并发数
  54. int maximumPoolSize = cpuNum * 2 + 1;
  55. // 核心线程数、最大线程数、闲置线程存活时间、时间单位、线程队列、线程工厂、当前线程数已经超过最大线程数时的异常处理策略
  56. threadPool = new ThreadPoolExecutor(maximumPoolSize - 1, maximumPoolSize, KEEP_ALIVE_TIME,
  57. TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(BLOCKING_QUEUE_LENGTH),
  58. new ThreadFactoryBuilder().setNameFormat(POOL_NAME + "-%d").build(),
  59. new ThreadPoolExecutor.AbortPolicy() {
  60. @Override
  61. public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
  62. LOGGER.warn("线程爆炸了,当前运行线程总数:{},活动线程数:{}。等待队列已满,等待运行任务数:{}", e.getPoolSize(), e.getActiveCount(),
  63. e.getQueue().size());
  64. }
  65. });
  66. }
  67. return threadPool;
  68. }
  69. }

2.实际使用

  1. ThreadPoolUtils.execute(() -> {
  2. this.Method();
  3. });

Java新建一个子线程异步运行方法的更多相关文章

  1. java多线程之守护线程以及Join方法

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.守护线程概述及示例 守护线程就是为其它线程提供"守护"作用,说白了就是为其它线程服务的,比如GC线程. java程序中线程分 ...

  2. Java中怎样创建线程安全的方法

    面试问题: 下面的方法是否线程安全?怎样让它成为线程安全的方法? class MyCounter { private static int counter = 0; public static int ...

  3. linux_redhat_线程后台运行方法

    建议看完1:后直接看2 screen 方式熟练些可靠. 次方法适用于redhat系统,unbunt* 系统用screen 命令 产看系统版本 cat /proc/version 首先项目制作的sh文件 ...

  4. 如何在Java中编写一个线程安全的方法?

    线程安全总是与多线程有关的,即一个线程访问或维护数据时遭到了其它线程的“破坏”,为了不被破坏,就要保持所维护变量的原子性: 1 局部变量总是线程安全的,因为每个线程都有自己的栈,而在方法中声明的变量都 ...

  5. Java中的后台线程和join方法

    /*守护线程(后台线程):在一个进程中如果只剩下 了守护线程,那么守护线程也会死亡. 需求: 模拟QQ下载更新包. 一个线程默认都不是守护线程. */ public class Demo extend ...

  6. Java多线程学习(三)---线程的生命周期

    线程生命周期 摘要: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(Running).阻塞 ...

  7. JAVA学习笔记16——线程生命周期

    当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(Running).阻塞(Blocking)和 ...

  8. Java多线程理解:线程安全的集合对象

    1.概念介绍 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染. 线程不安全就 ...

  9. 温故知新-java多线程&深入理解线程池

    文章目录 摘要 java中的线程 java中的线程池 线程池技术 线程池的实现原理 简述 ThreadPoolExecutor是如何运行的? 线程池运行的状态和线程数量 任务执行机制 队列缓存 Wor ...

  10. Thread类的常用方法_获取线程名称的方法和Thread类的常用方法_设置线程名称的方法

    构造方法: public Thread();分配一个新的线程对象 public Thread(String name);分配一个指定名字的新的线程对象 public Thread(Runnable t ...

随机推荐

  1. [转帖]一次 Java 进程 OOM 的排查分析(glibc 篇)

    https://juejin.cn/post/6854573220733911048 遇到了一个 glibc 导致的内存回收问题,查找原因和实验的的过程是比较有意思的,主要会涉及到下面这些: Linu ...

  2. [转帖]linux 查看CPU 内存的信息

    https://bbs.huaweicloud.com/blogs/302929   [摘要] ECS信息规格:2vCPUs | 4GiB | kc1.large.2镜像:openEuler 20.0 ...

  3. Stress-ng 的简单学习

    背景 想研究一下国产和不同架构,不通型号CPU的算力 也作为后续生产交付的基线准备. 学习各种不同工具进行简要测试. 安装 git clone https://github.com/ColinIanK ...

  4. 从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系。

    从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系. 项目效果 以下两张图是系统实际运行效果: 1.项目运行方式 运行环境:Python3 数据库:neo4j 预 ...

  5. 语言模型的预训练[6]:思维链(Chain-of-thought,CoT)定义原理详解、Zero-shot CoT、Few-shot CoT 以及在LLM上应用

    大语言模型的预训练[6]:思维链(Chain-of-thought,CoT)定义原理详解.Zero-shot CoT.Few-shot CoT 以及在LLM上应用 1.思维链定义 背景 在 2017- ...

  6. tensorflow语法【tf.matmul() 、loc和iloc函数、tf.expand_dims()】

    相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...

  7. 使用Miniconda安装R语言环境

    使用Miniconda安装R语言 下载Miniconda3-latest-Linux-x86_64.sh 静默安装 sh Miniconda3-latest-Linux-x86_64.sh -b -p ...

  8. SSD数据不能恢复?或许还有的救

    我们经常说机械硬盘相对于固态硬盘的一个优势是数据可以恢复,难道SSD固态硬盘的数据就不能恢复了吗? 这里先简单介绍一下SSD的工作方式,SSD中的数据是以电子的形式通过浮栅保存的,写入就是通过增加电压 ...

  9. MASA学习和总结

    一.MASA概述 MASA是温州数闪科技推出的开源产品,目前有三个产品线,分别是MASA Stack,MASA Framework,MASA Blazor. MASA Stack:是一个开源.企业级. ...

  10. 小知识:解决EXP-00003的报错

    客户有个需求:某用户程序(含exp导出任务)报错EXP-00003,这个错误并不会影响整个导出任务的结束,但由于是晚上的定时任务,该错误会触发夜间告警.客户想通过数据库层面来规避掉此错误. 事实上,这 ...