package com.alibaba.rocketmq.namesrv.sync; import java.util.Map.Entry; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; /** * @author lansheng.zj@taobao.com * * @param <R> * ����ֵ���� * @param <T> * �������� */ public class TaskGroupExecutor<R, T> { private ExecutorService executorService; public TaskGroupExecutor(ThreadFactory threadFactory) { this(32, threadFactory); } public TaskGroupExecutor(int nThreads, ThreadFactory threadFactory) { executorService = Executors.newFixedThreadPool(nThreads, threadFactory); } public TaskGroupExecutor(int nThreads) { executorService = Executors.newFixedThreadPool(nThreads, new ThreadFactory() { private AtomicInteger index = new AtomicInteger(0); @Override public Thread newThread(Runnable r) { return new Thread(r, "taskgroup-executor-" + index.getAndIncrement()); } }); } public FutureGroup<R> groupCommit(TaskGroup<R, T> taskGroup, final T t) { final CountDownLatch latch = new CountDownLatch(taskGroup.size()); FutureGroup<R> future = new FutureGroup<R>(latch, taskGroup.getKeys()); for (final Entry<String, Task<R, T>> entry : taskGroup) { future.addResult(entry.getKey(), executorService.submit(new Callable<R>() { @Override public R call() throws Exception { try { return entry.getValue().exec(t); } catch (Exception e) { // TODO throw e; } finally { latch.countDown(); } } })); } return future; } public void shutdown() { executorService.shutdown(); } }