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