当前位置:嗨网首页>书籍在线阅读

09-案例实现

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

案例实现

根据如下步骤实现本案例。

1.创建一个名为 FactorialCalculator 的类。该类对象实现了泛型为 IntegerCallable 接口:

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.如果 number01 ,则返回 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.用 ExecutorsnewFixedThreadPool() 方法创建一个 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();