09-案例实现
案例实现
根据如下步骤实现本案例。
1.创建一个名为 FactorialCalculator
的类。该类对象实现了泛型为 Integer
的 Callable
接口:
public class FactorialCalculator implements Callable<Integer> {
2.声明一个私有的名为 number
的整型变量——存储任务的返回结果:
private final Integer number;
3.实现该类的构造方法,并初始化类中变量:
public FactorialCalculator(Integer number){
this.number=number;
}
4.实现 call()
方法。该方法返回 FactorialCalculator
中变量 number
的阶乘:
@Override
public Integer call() throws Exception {
5.在方法内创建并初始化一个内部变量:
int result = 1;
6.如果 number
为 0
或 1
,则返回 1
;否则,计算 number
的阶乘。为了表现得更清楚,在每两次乘法之间,让当前任务休眠20ms:
if ((number==0)||(number==1)) {
result=1;
} else {
for (int i=2; i<=number; i++) {
result*=i;
TimeUnit.MILLISECONDS.sleep(20);
}
}
7.在控制台打印操作结果的详细信息:
System.out.printf("%s: %d\n",Thread.currentThread().getName(),
result);
8.返回操作结果:
return result;
9.至此开始实现应用程序的主方法,创建包含 main()
方法的 Main
类:
public class Main {
public static void main(String[] args) {
10.用 Executors
的 newFixedThreadPool()
方法创建一个 ThreadPoolExecutor
实例对象以执行提交的任务。设定执行器的线程数量为2:
ThreadPoolExecutor executor=(ThreadPoolExecutor)Executors
.newFixedThreadPool(2);
11.创建一个 Future
对象列表:
List<Future<Integer>> resultList=new ArrayList<>();
12.用 Random
类创建一个随机数生成器:
Random random=new Random();
13.使程序循环10次,在每次循环中都生成一个随机数字:
for (int i=0; i<10; i++){
Integer number= random.nextInt(10);
14.创建一个 FactorialCalculator
对象,并传入一个生成的随机数字作为参数:
FactorialCalculator calculator=new FactorialCalculator(number);
15.调用执行器的 submit()
方法,将 FactorialCalculator
任务提交到执行器。该方法通过返回一个 Future
实例对象来管理提交的任务并获取最终的执行结果:
Future<Integer> result=executor.submit(calculator);
16.向之前创建的列表中加入一个 Future
实例对象:
resultList.add(result);
}
17.创建一个 do
循环来监控执行器状态:
do {
18.在控制台打印日志,用执行器的 getCompletedTaskNumber()
方法来记录执行完成的任务数:
System.out.printf("Main: Number of Completed Tasks: %d\n",
executor.getCompletedTaskCount());
19.轮询列表中的10个 Future
对象,调用 isDone()
方法并打印日志,记录是否该任务已经执行完成:
for (int i=0; i<resultList.size(); i++) {
Future<Integer> result=resultList.get(i);
System.out.printf("Main: Task %d: %s\n",i,result.isDone());
}
20.让当前线程休眠50ms:
try {
TimeUnit.MILLISECONDS.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
21.重复循环过程,直到执行器中已完成的任务数小于10:
} while (executor.getCompletedTaskCount()<resultList.size());
22.在控制台打印日志,记录每个任务的返回结果。在每个 Future
实例对象中,通过 get()
方法获取任务执行返回的 Integer
对象:
System.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();
}
23.在控制台打印获取的数值:
System.out.printf("Main: Task %d: %d\n",i,number);
}
24.调用执行器的 shutdown()
方法来终结本次执行:
executor.shutdown();