14-案例实现
案例实现
按照如下步骤来实现本案例。
1.完成一个继承 RecursiveAction 的 Task 类:
public class Task extends RecursiveAction{
2.在该类中添加一个存放增加元素的 int 型数组:
private final int array[];
3.声明两个 int 类型的属性 start 和 end ,它们记录当前任务需要处理的数据块的起点和终点:
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");
}