在java当中,异常一共分为两种。一种是运行时异常,一种是非运行是异常。
非运行时异常:这些异常必须在方法上通过throws子句抛出。或者在方法体内进行try{…}catch{…}来捕获异常。
运行时异常: 这些方法不需要在throws子句抛出,也不需要在方法体内进行try{}catch{}操作。

在ForkJoin框架中声明的compute()方法不允许在运行是抛出异常,因为这个方法的实现没有包含任何throws申明。因此,必须包含必须的代码来处理相关的异常。
下面通过一个示例来说明这种情况。

首先创建一个ForkJoin框架执行的任务类。

Task.java

public class Task extends RecursiveTask<Integer>{

    private static final long serialVersionUID = 1L;
private int array[];
private int start,end;
public Task(int array[],int start,int end){
this.array = array;
this.start = start;
this.end = end;
}
protected Integer compute() {
System.out.printf("Task:Start from %d to %d\n",start,end);
if(end-start<10){
if((start<3)&&(3<end)){
throw new RuntimeException("This task throws an"+"Exception:Task from "+start+"to "+end);
}
else{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
else{
int mid = (end+start)/2;
Task task1 = new Task(array,start,mid);
Task task2 = new Task(array,start,mid);
invokeAll(task1,task2);
}
System.out.printf("Task:End form %d to %d \n",start,end);
return 0;
}
}

然后是执行的主类:

public class Main {

    public static void main(String[] args) {
int array[] = new int[100];
Task task = new Task(array,1,100);
ForkJoinPool pool = new ForkJoinPool();
pool.execute(task);
pool.shutdown();
try {
pool.awaitTermination(1,TimeUnit.DAYS);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(task.isCompletedAbnormally()){
System.out.print("Main:An exception has occured\n");
System.out.printf("Main:%s\n",task.getException()); }
}
}

运行结果为:

Task:Start from 1 to 7
Task:Start from 1 to 7
Task:Start from 1 to 13
Task:Start from 1 to 7
Task:Start from 1 to 7
Main:An exception has occured
Main:java.lang.RuntimeException: java.lang.RuntimeException: This task throws anException:Task from 1to 7

最新文章

  1. mac 之 jmeter下载、解压、启动
  2. [2014.01.27]wfImage 图像处理组件 3.3
  3. PAT乙级 1008. 数组元素循环右移问题 (20)
  4. WebContentGenerator
  5. Android开发中,那些让你相见恨晚的方法、类或接口
  6. python之文件
  7. php怎么保留相除后几位小数:sprintf
  8. merge into Oracle里的 saveOrUapdate
  9. Android外部存储 - 官方文档解读
  10. queue C++
  11. Jenkins + robot framework + git持续集成
  12. mssql sqlserver updatetext关键字应用简介说明
  13. C# yield return 和 yield break
  14. 对List集合中的对象中的某个属性进行排序
  15. 编写脚本实现DHCP服务与DHCP中继自动化执行
  16. centos中docker的安装
  17. tomcat server.xml
  18. ODAC(V9.5.15) 学习笔记(三)TOraSession(4)
  19. 《FPGA设计技巧与案例开发详解-第二版》全套资料包
  20. 菜鸟译文(二)——使用Java泛型构造模板方法模式

热门文章

  1. &lt;摘录&gt;GCC 中文手
  2. 让你的WPF程序在Win7下呈现Win8风格主题
  3. SQL Server 2012的内部原理和故障排除(50):Burgess_Liu的专栏
  4. mysql将字符串字段转为数字排序或比大小
  5. linux面试题目—2
  6. 将具有特殊class名img标签替换成[img][/img]标签--javascript正则表达式实践
  7. piwik网站访问统计系统
  8. POJ 2664 Prerequisites?(简单题)
  9. 解决python pymysql.err.OperationalError: (2013, &#39;Lost connection to MySQL server during query&#39;)
  10. CF无法全屏怎么办