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的最小size int remNum = tasks.size() % taskSize; // 得到余数 int index = 0; for (int i = 0; i < taskSize; i++) { int arrNum = baseNum; // 每个list对应的size if (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(); } }
自定义 ForkJoinPool
猜你喜欢
转载自m635674608.iteye.com/blog/2268770
今日推荐
周排行