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());}}