public static voidlistenableFuture() {try{
ListeningExecutorService pool= MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2));
List> futures = new ArrayList<>();for (int i = 0; i < 20; i++) {final ListenableFuture future = pool.submit(newCountTask());
futures.add(future);
Futures.addCallback(future,new FutureCallback() {
@Overridepublic voidonSuccess(Integer result) {
System.out.println(result);
}
@Overridepublic voidonFailure(Throwable t) {
t.printStackTrace();
}
});
}
System.out.println("submit success");
ListenableFuture> ret =Futures.successfulAsList(futures);
List res =ret.get();
System.out.println(res);
pool.shutdown();
System.out.println("shutdown success");
}catch(Exception e) {
e.printStackTrace();
}
}public static void countDownCount() throwsException {int threadNum = 20;
ExecutorService executor=Executors.newCachedThreadPool();
CountDownLatch count= newCountDownLatch(threadNum);
List> futureTasks = new ArrayList<>();for (int i = 0; i < threadNum; i++) {
CountTask task= newCountTask(count);
FutureTask futureTask = new FutureTask<>(task);
executor.submit(futureTask);
futureTasks.add(futureTask);
}//该动作会阻塞主线程知道各个线程完成任务
count.await();
System.out.println("执行完成");for (FutureTaskfutureTask : futureTasks) {
Integer ret=futureTask.get();
System.out.println(ret);
}
executor.shutdown();
System.out.println("测试完成");
}public static void futureTaskCount() throwsException {int threadNum = 20;
ExecutorService executor=Executors.newCachedThreadPool();
List> futureTasks = new ArrayList<>();for (int i = 0; i < threadNum; i++) {
CountTask task= newCountTask();
FutureTask futureTask = new FutureTask<>(task);
executor.submit(futureTask);
futureTasks.add(futureTask);
}//关闭线程池,该动作会阻塞主线程知道线程池中线程执行完成
executor.shutdown();
System.out.println("shutdown");for (FutureTaskfutureTask : futureTasks) {
Integer ret=futureTask.get();
System.out.println(ret);
}
System.out.println("测试完成");
}public static void completionCount() throwsException {int threadNum = 20;
ExecutorService executor= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
CompletionService pool = new ExecutorCompletionService(executor);for (int i = 0; i < threadNum; i++) {
pool.submit(newCountTask());
}for (int i = 0; i < threadNum; i++) {
Integer ret=pool.take().get();
System.out.println("输出结果" +ret);
}
System.out.println("测试完成");
executor.shutdown();
}//使用阻塞容器保存每次Executor处理的结果,在后面进行统一处理
public static void blockingQueueCount() throwsException {
ExecutorService exec=Executors.newCachedThreadPool();
BlockingQueue> queue = new LinkedBlockingQueue>();for (int i = 0; i < 10; i++) {
Future future = exec.submit(newCountTask());
queue.add(future);
}int sum = 0;int queueSize =queue.size();for (int i = 0; i < queueSize; i++) {
sum+=queue.take().get();
}
System.out.println("总数为:" +sum);
exec.shutdown();
}