当前位置: 首页 > news >正文

基于实现Runnable接口的java多线程

    Java多线程通常可以通过继承Thread类或者实现Runnable接口实现。本文主要介绍实现Runnable接口的java多线程的方法, 并通过ThreadPoolTaskExecutor调用执行,以及应用场景。

一、应用场景

异步、并行、子任务、磁盘读写、数据库查询、网络请求等耗时操作等。

以下以定时任务中,for循环的并行操作为例,在for循环中应用多线程。

二、实现Runnable接口

Java中的Runnable接口只有一个方法run(),实现runnable接口复写run()方法。

示例:

DtoRealtimeThreadTask.java 线程方法 

public class DtoRealtimeThreadTask implements Runnable{private IFactoryService factoryService;private RedisCache redisCache;
private RedisTemplate redisTemplate;private int runMinutes;//  重定义构造方法1public DtoRealtimeThreadTask(RedisTemplate redisTemplate , int runMinutes, IFactoryService factoryService , RedisCache redisCache){this.redisTemplate = redisTemplate;this.runMinutes = runMinutes;this.factoryService= factoryService;this.redisCache = redisCache;
}//  重定义构造方法2***//  重写run方法@Override
public void run() {// run方法中的service、实体类等变量均为本类中的变量,不能使用@Autowired// 本类中的变量由自定义构造方法传入}}

三、ThreadPoolTaskExecutor调用run方法

ThreadPoolTaskExecutor.excute(a);

示例:

定时任务for循环内,并行任务使用多线程:

for(Object obj : objList){// 1、调用线程构造方法DtoRealtimeThreadTask dtoRealtimeThreadTask= new DtoRealtimeThreadTask(redisTemplate,runMinutes,factoryService, redisCache);// 2、执行run方法threadPoolTaskExecutor.execute(dtoRealtimeThreadTask);// 3、附:线程执行状态:long taskCount = threadPoolTaskExecutor.getThreadPoolExecutor().getTaskCount();
long completedCount = threadPoolTaskExecutor.getThreadPoolExecutor().getCompletedTaskCount();
if(taskCount - completedCount >= 1000){logger.info("@@@@@@@@@@@@@@@@@@ 线程池活跃线程数量:{}", threadPoolTaskExecutor.getActiveCount());logger.info("@@@@@@@@@@@@@@@@@@ 线程池任务数量:{}", taskCount);logger.info("@@@@@@@@@@@@@@@@@@ 线程池已完成任务数量:{}", completedCount);logger.info("XXXXXXXXXXXXXXXXXXXXXXXXXXX---- 主线程休眠5秒 ----XXXXXXXXXXXXXXXXXXXXXXXXXXX");try{Thread.sleep(10000);}catch (Exception e){logger.error(e.getMessage());}}

http://www.lryc.cn/news/398538.html

相关文章:

  • 如何在uniapp中使用websocket?
  • PCL 点云PFH特征描述子
  • linux程序安装-编译-rpm-yum
  • 【网络协议】PIM
  • Redis 中的跳跃表(Skiplist)基本介绍
  • C语言编译和编译预处理
  • ahb 总线的一些思考
  • spark shuffle写操作——SortShuffleWriter
  • ESP32CAM物联网教学12
  • 【C++精华铺】12.STL list模拟实现
  • ChatGPT Mac App 发布!
  • ACE之ACE_Time_Value
  • [论文笔记] 自对齐指令反翻译:SELF-ALIGNMENT WITH INSTRUCTION BACKTRANSLATION
  • 算术运算符. 二
  • 代码优化方法记录
  • qt 图形、图像、3D相关知识
  • 【逆向基础】十、工具分享之DIE(Detect It Easy)
  • Netcat:——网络瑞士军刀
  • C++ //练习 14.50 在初始化ex1和ex2的过程中,可能用到哪些类类型的转换序列呢?说明初始化是否正确并解释原因。
  • 【开源 Mac 工具推荐之 1】gibMacOS:方便快捷的 macOS 完整包下载 Shell 工具
  • pdf文件如何快速英文转中文?
  • 程序的控制结构——if-else语句(双分支结构)【互三互三】
  • [C++]初识C++(命名空间,命名空间使用,函数重载,缺省参数等)
  • 每天一个数据分析题(四百十六)- 线性回归模型
  • JupyterNotebook中导出当前环境,并存储为requirements.txt
  • Java对象复制系列二: 手把手带你写一个Apache BeanUtils
  • 一个极简的 Vue 示例
  • 修复 Ubuntu 24.04 Dock 丢失应用程序图标
  • idea MarketPlace插件找不到
  • windows下使用编译opencv在qt中使用