自定义 ForkJoinPool
来源:互联网 发布:淄博阿雷seo博客 编辑:程序博客网 时间:2024/09/21 08:17
package com.tuchaoshi.base.concurrent;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.Executors;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.google.common.collect.Lists;import com.google.common.util.concurrent.Futures;import com.google.common.util.concurrent.ListenableFuture;import com.google.common.util.concurrent.ListeningExecutorService;import com.google.common.util.concurrent.MoreExecutors;public class ForkJoinPool<T> {private final static Logger logger = LoggerFactory.getLogger(ForkJoinPool.class);public static final int AVAILABLE_PROCESSORS_SIZE = Runtime.getRuntime().availableProcessors();private ListeningExecutorService executorService = null;private ThreadLocal<List<ListenableFuture<T>>> futuresThreadLocal = new ThreadLocal<List<ListenableFuture<T>>>(){protected java.util.List<com.google.common.util.concurrent.ListenableFuture<T>> initialValue() { return Lists.newArrayList();};};public ForkJoinPool() {this(AVAILABLE_PROCESSORS_SIZE*2);}public ForkJoinPool(int poolSize) {executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(poolSize));}public void createTask() {}/** * * @description * @return ListenableFuture<T> * @Exception */public ForkJoinPool<T> addTaskList(final List<Callable<T>> callables) {if(callables!=null){for(Callable<T> c:callables){addTask(c);}}return this;}/** * * @description * @return ListenableFuture<T> * @Exception */public ForkJoinPool<T> addTask(final Callable<T> callable) {ListenableFuture<T> listenableFuture = executorService.submit(callable);futuresThreadLocal.get().add(listenableFuture);return this;}/** * 多线程执行商品生成信息 * * @description * @return * @Exception */public List<T> executeTask(List<ListenableFuture<T>> futures) {long gstartTime = System.currentTimeMillis();ListenableFuture<List<T>> successfulQueries = Futures.successfulAsList(futures);try {// 获取所有线程的执行结果List<T> lists = successfulQueries.get();return lists;} catch (Exception e) {logger.error(e.getMessage(), e);} logger.info(" executeTask ! cost time:"+ (System.currentTimeMillis() - gstartTime));return null;}/** * 多线程执行商品生成信息 * * @description * @return * @Exception */public List<T> executeTask() {List<ListenableFuture<T>> futures = futuresThreadLocal.get();try {return executeTask(futures);} catch (Exception e) {logger.error(e.getMessage(), e);} finally {futuresThreadLocal.remove();}return null;}/** * 拆分任务 * * @param tasks * @param 拆分数量 * @return */public static <T> List<T> mergeTask(List<List<T>> tasks) {if(tasks==null){return null;}List<T> list = Lists.newArrayList();for(List<T> l:tasks){if(l!=null){list.addAll(l);}}return list;}/** * 拆分任务 * * @param tasks * @param 拆分数量 * @return */public static <T> List<List<T>> splitTask(List<T> tasks, Integer taskSize) {List<List<T>> list = Lists.newArrayList(); if(tasks==null || taskSize <= 0){return list;} if(tasks.size() < taskSize){ list.add(tasks); return list; } int baseNum = tasks.size() / taskSize; // 每个list的最小sizeint remNum = tasks.size() % taskSize; // 得到余数int index = 0;for (int i = 0; i < taskSize; i++) {int arrNum = baseNum; // 每个list对应的sizeif (i < remNum) {arrNum += 1;}List<T> ls = Lists.newArrayList();for (int j = index; j < arrNum + index; j++) {ls.add(tasks.get(j));}list.add(ls);index += arrNum;}return list;}public void shutdown() {this.executorService.shutdown();}}
0 0
- 自定义 ForkJoinPool
- ForkJoinPool
- ForkJoinPool
- ForkJoinPool
- ForkJoinPool类并行处理
- 关于jdk7的forkjoinpool
- 线程池ForkJoinPool
- ForkJoinPool的使用
- ForkJoinPool/fork/join
- 【Java多线程】ForkJoinPool
- ForkJoinPool框架示例
- Fork/join框架之ForkJoinPool
- Java7之线程池ForkJoinPool
- ForkJoin 源码分析之ForkJoinPool
- Fork/join框架之ForkJoinPool
- 说一下 jdk7 的 ForkJoinPool
- (十九)java多线程之ForkJoinPool
- ForkJoinPool中submit处理流程
- tkinter官方文档学习笔记
- 练习一1012
- Java7 ForkJoin 源码分析
- SQLServer 根据执行计划创建索引
- 忘记svn密码怎么办
- 自定义 ForkJoinPool
- ThreadLocal内存泄露分析
- ThreadLocal的内存泄露
- 不同网段实现打印机共享
- java threadLocal 测试
- 可否强制修改常量的值?
- ElasticSearch:版本冲突处理(事务控制)
- Frament的基本概念和解析
- AndBug 安装