做網(wǎng)站的工作流程成都網(wǎng)站seo設(shè)計(jì)
? ? Java多線(xiàn)程通??梢酝ㄟ^(guò)繼承Thread類(lèi)或者實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)。本文主要介紹實(shí)現(xiàn)Runnable接口的java多線(xiàn)程的方法, 并通過(guò)ThreadPoolTaskExecutor調(diào)用執(zhí)行,以及應(yīng)用場(chǎng)景。
一、應(yīng)用場(chǎng)景
異步、并行、子任務(wù)、磁盤(pán)讀寫(xiě)、數(shù)據(jù)庫(kù)查詢(xún)、網(wǎng)絡(luò)請(qǐng)求等耗時(shí)操作等。
以下以定時(shí)任務(wù)中,for循環(huán)的并行操作為例,在for循環(huán)中應(yīng)用多線(xiàn)程。
二、實(shí)現(xiàn)Runnable接口
Java中的Runnable接口只有一個(gè)方法run(),實(shí)現(xiàn)runnable接口復(fù)寫(xiě)run()方法。
示例:
DtoRealtimeThreadTask.java 線(xiàn)程方法?
public class DtoRealtimeThreadTask implements Runnable{private IFactoryService factoryService;private RedisCache redisCache;
private RedisTemplate redisTemplate;private int runMinutes;// ?重定義構(gòu)造方法1public DtoRealtimeThreadTask(RedisTemplate redisTemplate , int runMinutes, IFactoryService factoryService , RedisCache redisCache){this.redisTemplate?= redisTemplate;this.runMinutes = runMinutes;this.factoryService= factoryService;this.redisCache = redisCache;
}// ?重定義構(gòu)造方法2***// ?重寫(xiě)run方法@Override
public void run() {// run方法中的service、實(shí)體類(lèi)等變量均為本類(lèi)中的變量,不能使用@Autowired// 本類(lèi)中的變量由自定義構(gòu)造方法傳入}}
三、ThreadPoolTaskExecutor調(diào)用run方法
ThreadPoolTaskExecutor.excute(a);
示例:
定時(shí)任務(wù)for循環(huán)內(nèi),并行任務(wù)使用多線(xiàn)程:
for(Object obj : objList){// 1、調(diào)用線(xiàn)程構(gòu)造方法DtoRealtimeThreadTask?dtoRealtimeThreadTask= new DtoRealtimeThreadTask(redisTemplate,runMinutes,factoryService,?redisCache);// 2、執(zhí)行run方法threadPoolTaskExecutor.execute(dtoRealtimeThreadTask);// 3、附:線(xiàn)程執(zhí)行狀態(tài):long taskCount = threadPoolTaskExecutor.getThreadPoolExecutor().getTaskCount();
long completedCount = threadPoolTaskExecutor.getThreadPoolExecutor().getCompletedTaskCount();
if(taskCount - completedCount >= 1000){logger.info("@@@@@@@@@@@@@@@@@@ 線(xiàn)程池活躍線(xiàn)程數(shù)量:{}", threadPoolTaskExecutor.getActiveCount());logger.info("@@@@@@@@@@@@@@@@@@ 線(xiàn)程池任務(wù)數(shù)量:{}", taskCount);logger.info("@@@@@@@@@@@@@@@@@@ 線(xiàn)程池已完成任務(wù)數(shù)量:{}", completedCount);logger.info("XXXXXXXXXXXXXXXXXXXXXXXXXXX---- 主線(xiàn)程休眠5秒?----XXXXXXXXXXXXXXXXXXXXXXXXXXX");try{Thread.sleep(10000);}catch (Exception e){logger.error(e.getMessage());}}