这是一个尝试做视频分片功能的类,其中
ExecutorService executorService = Executors.newFixedThreadPool(size);
是开启一个线程池,newFixedThreadPool()中填的参数是你这个线程池的大小。
以下代码则是遍历mediaProcessList对象,然后通过executorService.execute()方法来开始执行
mediaProcessList.forEach(mediaProcess -> {
//3.4遍历mediaProcess,将任务加入线程池
executorService.execute(()->{
//任务执行逻辑
});
});
附我学习时的代码,方便大家理解
package com.xuecheng.media.service.jobhandler;
import com.xuecheng.media.mapper.MediaProcessMapper;
import com.xuecheng.media.model.po.MediaProcess;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 视频处理任务类
*/
@Component
@Slf4j
public class VideoTask {
@Autowired
MediaProcessMapper mediaProcessMapper;
/*
视频处理任务
*/
@XxlJob("videoJobHandler")
public void videoJobHandler() throws Exception {
//1.分片参数
int shardIndex = XxlJobHelper.getShardIndex(); //执行器的序号,从0开始
int shardTotal = XxlJobHelper.getShardTotal(); //执行器的总数
System.out.println("shardIndex=" + shardIndex + ",shardTotal=" + shardTotal);
//3.1确定cpu的核数,以便新建线程池时可以确定线程数量
int processors = Runtime.getRuntime().availableProcessors();
//2.查询待处理的任务,processors表示假如cpu核心数是16核,则一次可以取出16个任务
List<MediaProcess> mediaProcessList = mediaProcessMapper.selectListByShardIndex(shardTotal, shardIndex, processors);
//3.2任务实际数量
int size = mediaProcessList.size();
//3.创建线程池
//3.3创建一个线程池(一个只要还有线程存在线程池就不会销毁的线程池,当任务处理完,则线程池才会销毁)
ExecutorService executorService = Executors.newFixedThreadPool(size);
mediaProcessList.forEach(mediaProcess -> {
//3.4遍历mediaProcess,将任务加入线程池
executorService.execute(()->{
//任务执行逻辑
//4.开启任务
//5.执行视频转码
//6.上传到minio
});
});
}
}
该博客文主要做笔记,仅供学习,希望对你有帮助