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

14-案例实现

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

案例实现

按照如下步骤来实现本案例。

1.完成一个继承 RecursiveActionTask 类:

public class Task extends RecursiveAction{

2.在该类中添加一个存放增加元素的 int 型数组:

private final int array[];

3.声明两个 int 类型的属性 startend ,它们记录当前任务需要处理的数据块的起点和终点:

private final int start;
private final int end;

4.在类的构造函数中完成上述属性的初始化工作:

public Task (int array[], int start, int end) {
  this.array=array;
  this.start=start;
  this.end=end;
}

5.用任务的主逻辑实现 compute() 方法。如果当前任务需要处理的元素超过100个,那么首先把该任务分成两部分,并分别创建两个子任务完成这两部分工作,再用 fork() 方法开始执行任务并用 join() 方法等待它的终止:

protected void compute() {
  if (end-start>100) {
    int mid=(start+end)/2;
    Task task1=new Task(array,start,mid);
    Task task2=new Task(array,mid,end);
    task1.fork();
    task2.fork();
    task1.join();
    task2.join();

6.如果任务必须处理100个或者更少的元素,则在每次操作后把数组里的每个元素自增1并休眠5ms:

  } else {
      for (int i=start; i<end; i++) {
        array[i]++;
        try {
          Thread.sleep(5);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

7.实现本案例的主类,新建 Main 类和 main() 方法:

public class Main {
  public static void main(String[] args) throws Exception {

8.创建 ForkJoinPool 类型的 pool 对象:

ForkJoinPool pool=new ForkJoinPool();

9.创建一个可以容纳10000个元素的整数数组 array

int array[]=new int[10000];

10.创建一个新的 Task 对象来处理整个数组:

Task task1=new Task(array,0,array.length);

11.调用 execute() 方法,把任务提交到线程池中:

pool.execute(task1);

12.如果任务没有完成执行,则通过 showLog() 方法写入 ForkJoinPool 对象的状态信息并让线程休眠1s:

while (!task1.isDone()) {
  showLog(pool);
  TimeUnit.SECONDS.sleep(1);
}

13.通过 shutdown() 方法关闭线程池:

pool.shutdown();

14.用 awaitTermination() 等待线程池中的任务全部执行完成:

pool.awaitTermination(1, TimeUnit.DAYS);

15.用 showLog() 方法获取 ForkJoinPool 类的状态信息,并在程序执行结束时打印结束信息:

showLog(pool);
System.out.printf("Main: End of the program.\n");

16.实现 showLog() 方法。该方法接收一个 ForkJoinPool 类型的参数,并输出正在执行的线程和任务的状态信息:

private static void showLog(ForkJoinPool pool) {
  System.out.printf("**********************\n");
  System.out.printf("Main: Fork/Join Pool log\n");
  System.out.printf("Main: Fork/Join Pool: Parallelism: %d\n",
                    pool.getParallelism());
  System.out.printf("Main: Fork/Join Pool: Pool Size: %d\n",
                    pool.getPoolSize());
  System.out.printf("Main: Fork/Join Pool: Active Thread Count:
                    %d\n", pool.getActiveThreadCount());
  System.out.printf("Main: Fork/Join Pool: Running Thread Count:
                    %d\n", pool.getRunningThreadCount());
  System.out.printf("Main: Fork/Join Pool: Queued Submission:
                    %d\n", pool.getQueuedSubmissionCount());
  System.out.printf("Main: Fork/Join Pool: Queued Tasks: %d\n",
                    pool.getQueuedTaskCount());
  System.out.printf("Main: Fork/Join Pool: Queued Submissions:
                    %s\n", pool.hasQueuedSubmissions());
  System.out.printf("Main: Fork/Join Pool: Steal Count: %d\n",
                    pool.getStealCount());
  System.out.printf("Main: Fork/Join Pool: Terminated : %s\n",
                    pool.isTerminated());
  System.out.printf("**********************\n");
}