Java使用线程池批量顺序执行任务
来源:互联网 发布:整理桌面软件 编辑:程序博客网 时间:2024/05/22 06:47
使用线程池批量顺序执行任务
AtomicInteger、CountDownLatch、ThreadPoolExecutor组合使用
package tool.thread;import com.alibaba.fastjson.JSON;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.List;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.CountDownLatch;import java.util.concurrent.Executors;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.atomic.AtomicInteger;/** * Created by zengrenyuan on 17/9/19. */public class ThreadPollUtils { private static final Logger LOG = LoggerFactory.getLogger(ThreadPollUtils.class); /** * @param paramList 任务参数列表 * @param process 要执行的功能 * @param threadNum 线程数 * @param <P> 参数类型 * @param <V> 返回值类型 * @return 返回结果集 * @throws InterruptedException */ public static <P, V> Map<Integer, V> process(final List<P> paramList, final Process<P, V> process, int threadNum) throws InterruptedException { //如果任务数少于线程数取任务为线程个数 threadNum = Math.min(paramList.size(), threadNum); //保证任务是顺序执行的 final AtomicInteger atomicInteger = new AtomicInteger(0); //用于统计已经执行完成的线程 final CountDownLatch countDownLatch = new CountDownLatch(threadNum); //保存任务执行结果 final ConcurrentHashMap<Integer, V> resultMap = new ConcurrentHashMap<>(); ThreadPoolExecutor threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(threadNum); threadPool.setMaximumPoolSize(threadNum); for (int i = 0; i < threadNum; i++) { threadPool.execute(new Runnable() { @Override public void run() { try { while (true) { int index = atomicInteger.getAndAdd(1); if (index >= paramList.size()) { break; } P param = paramList.get(index); try { LOG.info("index:{}", index); V result = process.doTask(param); if (result != null) { LOG.info("index:{} result:{}", index, JSON.toJSONString(result)); resultMap.put(index, result); } } catch (Exception e) { LOG.error("运行失败 param:{}", JSON.toJSONString(param), e); } } } catch (Exception e) { LOG.error(null, e); } finally { countDownLatch.countDown(); } } }); } try { countDownLatch.await(); } catch (Exception e) { LOG.error(null, e); } threadPool.shutdown(); return resultMap; } /** * @param <P> 参数类型 * @param <V> 返回值类型 */ public interface Process<P, V> { V doTask(P p); }}
阅读全文
0 0
- Java使用线程池批量顺序执行任务
- java 线程池批量执行
- Java 使用线程池执行大数据量统计任务
- java使用CountDownLatch实现线程顺序执行
- java并发 -线程池,任务执行
- Java多线程--任务执行(线程池)
- Java并发编程——线程池的使用(三)线程池执行任务、取消任务
- java线程池中任务执行完成后再次执行
- Java 线程的执行顺序
- JAVA线程分组顺序执行
- java 线程按顺序执行
- Java线程循环顺序执行
- Java线程执行顺序小结及线程池终止判定
- Java中使用ReentrantLock控制线程执行顺序
- 一个线程执行多个任务,要按照顺序执行
- (十七)java并发编程--任务执行之线程池的使用
- Javaの线程之多线程执行顺序
- 线程池任务执行流程
- 自我参考-Java面向对象(下)
- python中对类的理解
- 类和对象
- 【正念奇迹】-ZQ0014-《高绩效教练》
- Judge Route Circle
- Java使用线程池批量顺序执行任务
- 太上感应篇0021
- RPC框架 及 RMI
- 2016年计算机联考真题——寻求最大子集和的差
- [数位DP] Codeforces 809C Round #415 (Div. 1) C. Find a car
- Unity官方教程—space shooter练习日记之脚色移动
- Android Studio目录结构及工程项目结构解析
- 基于springboot+vue+element+ueditor实现前后端分离的富文本框实现
- kmp模板