future_callable
来源:互联网 发布:淘宝禁售手机卡 编辑:程序博客网 时间:2024/06/08 06:38
Future<V>代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞。FutureTask<V>实现了Future<V>和Runable<V>。Callable代表一个有返回值得操作。
简单代码:
public class FutureTest { public static class Task implements Callable<String>{@Overridepublic String call() throws Exception {Thread.sleep(1800);System.out.println("ah");return "something";} } public static void main(String[] args) throws InterruptedException, ExecutionException {List<Future<String>> future = new ArrayList<Future<String>>();ExecutorService service = Executors.newCachedThreadPool();for (int i = 0; i < 100; i++) {future.add(service.submit(new Task()));}for (Future<String> future2 : future) {System.out.println(future2.get());} }}
稍微复杂: 集合里面的数和,查看cpu数量,分开开线程
public class FutureTest1 {private ExecutorService exec; private int cpuCoreNumber; private List<Future<Long>> tasks = new ArrayList<Future<Long>>(); // 内部类 class SumCalculator implements Callable<Long> { private int[] numbers; private int start; private int end; public SumCalculator(final int[] numbers, int start, int end) { this.numbers = numbers; this.start = start; this.end = end; } public Long call() throws Exception { Long sum = 0l; for (int i = start; i < end; i++) { sum += numbers[i]; } return sum; } } public FutureTest1() { cpuCoreNumber = Runtime.getRuntime().availableProcessors(); exec = Executors.newFixedThreadPool(cpuCoreNumber); } public Long sum(final int[] numbers) { // 根据CPU核心个数拆分任务,创建FutureTask并提交到Executor for (int i = 0; i < cpuCoreNumber; i++) { int increment = numbers.length / cpuCoreNumber + 1; int start = increment * i; int end = increment * i + increment; if (end > numbers.length) end = numbers.length; SumCalculator subCalc = new SumCalculator(numbers, start, end); FutureTask<Long> task = new FutureTask<Long>(subCalc); tasks.add(task); if (!exec.isShutdown()) { exec.submit(task); } } return getResult(); } /** * 迭代每个只任务,获得部分和,相加返回 * * @return */ public Long getResult() { Long result = 0l; for (Future<Long> task : tasks) { try { // 如果计算未完成则阻塞 Long subSum = task.get(); result += subSum; } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } return result; } public void close() { exec.shutdown(); } public static void main(String[] args) { int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 10, 11 }; FutureTest1 calc = new FutureTest1(); Long sum = calc.sum(numbers); System.out.println(sum); calc.close(); }}
阅读全文
0 0
- future_callable
- 【Java并发编程】之五:volatile变量修饰符—意料之外的问题(含代码)
- 多线程/并发笔记:线程创建的三种方式
- 本地数据库-SQLLite
- 《Effective C++读书笔记》--条款34:区分接口继承和实现继承
- luoguP3834 【模板】可持久化线段树 1(主席树)
- future_callable
- 编程时的内存分配和存储区
- Thymeleaf教程 (二) 虚拟购物商店
- spring4-AOP面向切面编程
- 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛-F-Islands
- 安卓动画的使用 位移动画和缩放动画
- .net 判断文本的长度,先转成字节
- C# 理解lock
- Unity Shadow