Java并发编程之线程管理(Executor框架13)
来源:互联网 发布:黑手党3低配优化 编辑:程序博客网 时间:2024/05/19 13:14
4.3运用执行器返回结果
Executor框架的优势之一就是你能够运行并发的任务并且获得对应的结果。Java 并发API完成这个功能是通过下面两个接口:
l Callable: 这个接口有call()方法。在这个方法中,你不得不实现一个任务的逻辑代码。Callable接口是一个参数化的接口,意味着你不得不说明call()方法返回的数据类型。
l Future:这个接口有一些方法去获取由Callable对象产生的结果和管理它的状态。
下面看一个例子,比较好的说明了如何使用Callable和Future类。
import java.util.ArrayList;import java.util.List;//import java.util.Random;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.ThreadPoolExecutor;public class FactorialCalculator implements Callable<Integer> {/** * Number to calculate the factorial */private Integer number;public FactorialCalculator(){}/** * Constructor of the class. Initializes the attributes * @param number Number to calculate the factorial */public FactorialCalculator(Integer number){this.number=number;}/** * Method called by the executor to execute this task and calculate the factorial of a * number */@Overridepublic Integer call() throws Exception {int num, result;num=number.intValue();result=1;// If the number is 0 or 1, return the 1 valueif ((num==0)||(num==1)) {result=1;} else {// Else, calculate the factorialfor (int i=2; i<=number; i++) {result *= i;Thread.sleep(20);}}System.out.printf("%s: %d\n",Thread.currentThread().getName(),result);// Return the valuereturn result;}public void invokeCalling(){// Create a ThreadPoolExecutor with fixed size. It has a maximun of two threadsThreadPoolExecutor executor=(ThreadPoolExecutor)Executors.newFixedThreadPool(2);// List to store the Future objects that control the execution of the task and// are used to obtain the resultsList<Future<Integer>> resultList=new ArrayList<Future<Integer>>();// Create a random number generator//Random random=new Random();// Create and send to the executor the ten tasksfor (int i=0; i<10; i++){Integer number=new Integer(i);FactorialCalculator calculator=new FactorialCalculator(number);Future<Integer> result=executor.submit(calculator);resultList.add(result);}// Wait for the finalization of the ten tasksdo {System.out.printf("Main: Number of Completed Tasks: %d\n",executor.getCompletedTaskCount());int size = resultList.size();for (int i=0; i<size; i++) {Future<Integer> result=resultList.get(i);System.out.printf("Main: Task %d: %s\n", i, result.isDone());}try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}} while (executor.getCompletedTaskCount()<resultList.size());// Write the resultsSystem.out.printf("Main: Results\n");for (int i=0; i<resultList.size(); i++) {Future<Integer> result=resultList.get(i);Integer number=null;try {number=result.get();} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}System.out.printf("Core: Task %d: %d\n",i,number);}// Shutdown the executorexecutor.shutdown();}public static void main(String []args){(new FactorialCalculator()).invokeCalling();}}运行结果:
pool-1-thread-1: 1
Main: Number of Completed Tasks: 0
pool-1-thread-2: 1
Main: Task 0: true
Main: Task 1: true
Main: Task 2: false
Main: Task 3: false
Main: Task 4: false
Main: Task 5: false
Main: Task 6: false
Main: Task 7: false
Main: Task 8: false
Main: Task 9: false
pool-1-thread-1: 2
pool-1-thread-2: 6
Main: Number of Completed Tasks: 4
Main: Task 0: true
Main: Task 1: true
Main: Task 2: true
Main: Task 3: true
Main: Task 4: false
Main: Task 5: false
Main: Task 6: false
Main: Task 7: false
Main: Task 8: false
Main: Task 9: false
pool-1-thread-1: 24
Main: Number of Completed Tasks: 5
Main: Task 0: true
Main: Task 1: true
Main: Task 2: true
Main: Task 3: true
Main: Task 4: true
Main: Task 5: false
Main: Task 6: false
Main: Task 7: false
Main: Task 8: false
Main: Task 9: false
pool-1-thread-2: 120
Main: Number of Completed Tasks: 6
Main: Task 0: true
Main: Task 1: true
Main: Task 2: true
Main: Task 3: true
Main: Task 4: true
Main: Task 5: true
Main: Task 6: false
Main: Task 7: false
Main: Task 8: false
Main: Task 9: false
pool-1-thread-1: 720
Main: Number of Completed Tasks: 7
Main: Task 0: true
Main: Task 1: true
Main: Task 2: true
Main: Task 3: true
Main: Task 4: true
Main: Task 5: true
Main: Task 6: true
Main: Task 7: false
Main: Task 8: false
Main: Task 9: false
pool-1-thread-2: 5040
Main: Number of Completed Tasks: 8
Main: Task 0: true
Main: Task 1: true
Main: Task 2: true
Main: Task 3: true
Main: Task 4: true
Main: Task 5: true
Main: Task 6: true
Main: Task 7: true
Main: Task 8: false
Main: Task 9: false
Main: Number of Completed Tasks: 8
Main: Task 0: true
Main: Task 1: true
Main: Task 2: true
Main: Task 3: true
Main: Task 4: true
Main: Task 5: true
Main: Task 6: true
Main: Task 7: true
Main: Task 8: false
Main: Task 9: false
pool-1-thread-1: 40320
Main: Number of Completed Tasks: 9
Main: Task 0: true
Main: Task 1: true
Main: Task 2: true
Main: Task 3: true
Main: Task 4: true
Main: Task 5: true
Main: Task 6: true
Main: Task 7: true
Main: Task 8: true
Main: Task 9: false
pool-1-thread-2: 362880
Main: Results
Core: Task 0: 1
Core: Task 1: 1
Core: Task 2: 2
Core: Task 3: 6
Core: Task 4: 24
Core: Task 5: 120
Core: Task 6: 720
Core: Task 7: 5040
Core: Task 8: 40320
Core: Task 9: 362880
- Java并发编程之线程管理(Executor框架13)
- Java并发编程之线程管理(Executor框架11)
- Java并发编程之线程管理(Executor框架12)
- Java并发编程之线程管理(Executor框架14)
- Java并发编程之线程管理(Executor框架15)
- Java并发编程之线程管理(Executor框架16)
- Java并发编程-Executor框架之ScheduledThreadPoolExecutor
- Java并发编程-Executor框架之CompletionService
- 【Java并发编程】之十九:并发新特性—Executor框架与线程池(含代码)
- 【Java并发编程】之十九:并发新特性—Executor框架与线程池(含代码)
- 【Java并发编程】之十九:并发新特性—Executor框架与线程池(含代码)
- 【Java并发编程】之十九:并发新特性—Executor框架与线程池(含代码)(r)
- 【Java并发编程】之十九:并发新特性—Executor框架与线程池(含代码)
- Java并发编程之十九:并发新特性—Executor框架与线程池(含代码)
- 【Java并发编程】之十九:并发新特性—Executor框架与线程池
- JAVA随笔之线程编程(Executor框架)
- java并发编程-Executor框架
- java并发编程-Executor框架
- oracle特性之Block Change Tracking
- iPhone/Mac Objective-C内存管理教程和原理剖析
- 初创公司最爱使用的那些开发工具
- js计算器
- Hash表
- Java并发编程之线程管理(Executor框架13)
- Google Gson解析Json数据应用实例
- Android高级模糊技术
- 软件破解网站列表--整理于2014-3-30
- c++ const 用法
- 第一次邂逅快速傅立叶变换(FFT)
- 电话面试:求两个链表的第一个公共结点
- Lance老师UI系列教程第七课->自定义spinner下拉框实现的实现
- .net+jeasyui(jquery)+webservice+控制台(windows服务) 开发棋王竞猜游戏娱乐网站