自定义 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
原创粉丝点击