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

08-案例实现

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

案例实现

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

1.首先实现工作线程类。创建一个名为 AlwaysThrowsExceptionWorkerThread 的类,该类继承自 ForkJoinWorkerThread

public class AlwaysThrowsExceptionWorkerThread extends
                        ForkJoinWorkerThread {

2.实现该类的构造器。它接收一个 ForkJoinPool 对象作为构造参数,并用该参数调用其父构造器:

protected AlwaysThrowsExceptionWorkerThread(ForkJoinPool pool) {
    super(pool);
}

3.实现 onStart() 方法。它是 ForkJoinWorkerThread 类的方法,工作线程启动时会调用该方法。我们在其中抛出一个 RuntimeException

protected void onStart() {
  super.onStart();
  throw new RuntimeException("Exception from worker thread");
}

4.现在实现创建工作线程的工厂类。创建一个名为 AlwaysThrowsExceptionWorker- ThreadFactory 的类,实现 ForkJoinWorkerThreadFactory 接口:

public class AlwaysThrowsExceptionWorkerThreadFactory implements
                         ForkJoinWorkerThreadFactory {

5.实现 newThread() 方法。该方法接收 ForkJoinPool 对象作为参数,返回一个 ForkJoinWorkerThread 对象。创建并返回 AlwaysThrowsExceptionWorkerThread 类型对象

@Override
public ForkJoinWorkerThread newThread(ForkJoinPool pool) {
  return new AlwaysThrowsExceptionWorkerThread(pool);
}

6.实现一个类来管理工作线程抛出的异常。创建 Handler 并实现 UncaughtException- Handler 接口:

public class Handler implements UncaughtExceptionHandler {

7.实现 uncaughtException() 方法。每当工作线程抛出异常时, ForkJoinPool 都会调用该方法,它接收 Thread 对象和 Throwable 对象作为参数。它在该方法中打印一条信息后退出:

@Override
public void uncaughtException(Thread t, Throwable e) {
  System.out.printf("Handler: Thread %s has thrown an
                     Exception.\n",t.getName());
  System.out.printf("%s\n",e);
  System.exit(-1);
}

8.实现在 ForkJoinPool 中执行的任务。创建 OneSecondLongTask 类并继承 RecursiveAction

public class OneSecondLongTask extends RecursiveAction{

9.实现 compute() 方法,让线程休眠1s:

@Override
protected void compute() {
  System.out.printf("Task: Starting.\n");
  try {
    TimeUnit.SECONDS.sleep(1);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  System.out.printf("Task: Finish.\n");
}

10.实现本案例的主类,创建一个包含 main() 方法的 Main 类:

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

11.新建一个 OneSecondLongTask 对象:

OneSecondLongTask task=new OneSecondLongTask();

12.新建一个 Handler 对象:

Handler handler = new Handler();

13.新建一个 AlwaysThrowsExceptionWorkerThreadFactory 对象:

AlwaysThrowsExceptionWorkerThreadFactory factory=new
                    AlwaysThrowsExceptionWorkerThreadFactory();

14.新建一个 ForkJoinPool 对象。将数字2、 factory 对象、 handler 对象和 false 传入其中:

ForkJoinPool pool=new ForkJoinPool(2,factory,handler,false);

15.在线程池上用 execute() 方法执行任务:

pool.execute(task);

16.用 shutdown() 方法关闭 pool

pool.shutdown();

17.用 awaitTermination() 方法等待任务的完成:

try {
  pool.awaitTermination(1, TimeUnit.DAYS);
} catch (InterruptedException e) {
  e.printStackTrace();
}

18.打印程序结束信息:

System.out.printf("Task: Finish.\n");