java google 并发包 封装

来源:互联网 发布:淄博阿雷seo博客 编辑:程序博客网 时间:2024/06/03 23:12
package com.tuchaoshi.base.concurrent;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.Executors;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.util.CollectionUtils;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 abstract class ListeningExecutorServiceJob<K, V> {private final static Logger logger = LoggerFactory.getLogger(ListeningExecutorServiceJob.class);public static final int AVAILABLE_PROCESSORS_SIZE = Runtime.getRuntime().availableProcessors();private static ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(AVAILABLE_PROCESSORS_SIZE * 2));public ListeningExecutorServiceJob() {}/** * 多线程执行商品生成信息 *  * @description * @return List<TbArtsGoods> * @Exception */public List<V> executeTask(List<K> keyList) {if (keyList == null) {return null;}List<V> vList = Lists.newArrayList();long gstartTime = System.currentTimeMillis();List<ListenableFuture<List<V>>> futures = Lists.newArrayList();for (K k : keyList) {// 3级类别分组futures.add(executeTask(k));}ListenableFuture<List<List<V>>> successfulQueries = Futures.successfulAsList(futures);try {// 获取所有线程的执行结果List<List<V>> lists = successfulQueries.get();if (!CollectionUtils.isEmpty(lists)) {for (List<V> list : lists) {if (!CollectionUtils.isEmpty(list)) {vList.addAll(list);}}}} catch (Exception e) {logger.error(e.getMessage(), e);}logger.info(" executeTask ! cost time:"+ (System.currentTimeMillis() - gstartTime));return vList;}/** *  * @description * @return ListenableFuture<List<TbArtsGoods>> * @Exception */private ListenableFuture<List<V>> executeTask(final K k) {ListenableFuture<List<V>> listenableFuture = executorService.submit(new Callable<List<V>>() {@Overridepublic List<V> call() throws Exception {return createTask(k);}});return listenableFuture;}public abstract List<V> createTask(K k);/** * 拆分任务 *  * @param tasks * @param 拆分数量 * @return */public static <T> List<List<T>> splitTask(List<T> tasks, Integer taskSize) {List<List<T>> list = Lists.newArrayList();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 static void main(String[] args) {ListeningExecutorServiceJob<String, String> executorServiceTask = new ListeningExecutorServiceJob<String, String>() {@Overridepublic List<String> createTask(String k) {List<String> list = Lists.newArrayList();list.add(k + "====");return list;}};List<String> keyList = Lists.newArrayList();keyList.add("1");keyList.add("2");keyList.add("3");keyList.add("4");keyList.add("5");keyList.add("6");keyList.add("7");keyList.add("8");keyList.add("9");List<String> valueList = executorServiceTask.executeTask(keyList);System.out.println(valueList);System.out.println(splitTask(keyList, 6));System.out.println(splitTask(keyList, 5));System.out.println(splitTask(keyList, 4));System.out.println(splitTask(keyList, 3));System.out.println(splitTask(keyList, 2));System.out.println(splitTask(keyList, 1));ListeningExecutorServiceJob<List<String>, String> executorServiceTask2 = new ListeningExecutorServiceJob<List<String>, String>() {@Overridepublic List<String> createTask(List<String> k) {List<String> list = Lists.newArrayList();for (String s : k) {list.add(s + "=====");}return list;}};List<List<String>> strings = splitTask(keyList, 3);System.out.println(executorServiceTask2.executeTask(strings));}}

 

0 0
原创粉丝点击