JUC组件扩展(二)-JAVA并行框架Fork/Join(三):在任务中抛出异常
在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
JUC组件扩展(二)-JAVA并行框架Fork/Join(三):在任务中抛出异常的更多相关文章
- JUC组件扩展(二)-JAVA并行框架Fork/Join(四):监控Fork/Join池
Fork/Join 框架是为了解决可以使用 divide 和 conquer 技术,使用 fork() 和 join() 操作把任务分成小块的问题而设计的.主要实现这个行为的是 ForkJoinPoo ...
- JUC组件扩展(二)-JAVA并行框架Fork/Join(一):简介和代码示例
一.背景 虽然目前处理器核心数已经发展到很大数目,但是按任务并发处理并不能完全充分的利用处理器资源,因为一般的应用程序没有那么多的并发处理任务.基于这种现状,考虑把一个任务拆分成多个单元,每个单元分别 ...
- JUC组件扩展(二)-JAVA并行框架Fork/Join(二):同步和异步
在Fork/Join框架中,提交任务的时候,有同步和异步两种方式. invokeAll()的方法是同步的,也就是任务提交后,这个方法不会返回直到所有的任务都处理完了. fork方法是异步的.也就是你提 ...
- Java并行任务框架Fork/Join
Fork/Join是什么? Fork意思是分叉,Join为合并.Fork/Join是一个将任务分割并行运行,然后将最终结果合并成为大任务的结果的框架,父任务可以分割成若干个子任务,子任务可以继续分割, ...
- Java 并发编程 -- Fork/Join 框架
概述 Fork/Join 框架是 Java7 提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.下图是网上流传的 Fork Join 的 ...
- Java 并发之 Fork/Join 框架
什么是 Fork/Join 框架 Fork/Join 框架是一种在 JDk 7 引入的线程池,用于并行执行把一个大任务拆成多个小任务并行执行,最终汇总每个小任务结果得到大任务结果的特殊任务.通过其命名 ...
- JAVA并行框架:Fork/Join
一.背景 虽然目前处理器核心数已经发展到很大数目,但是按任务并发处理并不能完全充分的利用处理器资源,因为一般的应用程序没有那么多的并发处理任务.基于这种现状,考虑把一个任务拆分成多个单元,每个单元分别 ...
- JAVA并行框架学习之ForkJoin
当硬件处理能力不能按照摩尔定律垂直发展的时候,选择了水平发展,多核处理器已经广泛应用.未来随着技术的进一步发展,可能出现成百上千个处理核心,但现有的程序运行在多核心处理器上并不能得到较大性能的提升,主 ...
- Java并发编程--Fork/Join框架使用
上篇博客我们介绍了通过CyclicBarrier使线程同步,可是上述方法存在一个问题,那就是假设一个大任务跑了2个线程去完毕.假设线程2耗时比线程1多2倍.线程1完毕后必须等待线程2完毕.等待的过程线 ...
随机推荐
- 消除Xcode 5中JosnKit类库的bit masking for introspection of objective-c 警告
Xcode 5中苹果对多个系统框架及相关类库进行了改进.之前建立的项目在Xcode 5中重新编译会产生一些新问题. JosnKit是常用的轻量级Josn解析类,在Xcode 5中: BOOL work ...
- 陈立伟 - MultiCharts快易通(2013年8月2日)
<MultiCharts快易通> 作 者:陈立伟 译 者: 系 列:寰宇程式交易312--挑战程式交易系列1 出 版:寰宇出版股份有限公司 字 数:千字 阅读完成:2013年8月2日
- MYSQL复习笔记11-排序分组
Date: 20140223Auth: Jin 一.排序 order by作用:对查询结果进行排序1.基本语法SELECT column_name(s) FROM table_name ORDER B ...
- android基础知识复习——RelativeLayout布局属性、背景、半透明设置(XML设置)
转自:http://blog.csdn.net/fansongy/article/details/6817968 复习布局与XML,写了一个空的登录界面.XML的注释我写在当行的后面了.程序运行图: ...
- Flash&Flex大全
官方在线帮助(没标英文的都是中文) 用于 Adobe Flash Platform 的 ActionScript 3.0 参考 更多参考使这样的链接下载离线版:http://help.adobe.co ...
- Netty游戏服务器之六服务端登录消息处理
客户端unity3d已经把消息发送到netty服务器上了,那么ServerHandler类的public void channelRead(ChannelHandlerContext ctx, Obj ...
- XenApp应用虚拟化介绍
https://wenku.baidu.com/view/635223c26137ee06eff91864.html
- opencv Mat 像素操作
1 cv::Mat cv::Mat是一个n维矩阵类,声明在<opencv2/core/core.hpp>中. class CV_EXPORTS Mat { public: //a lo ...
- Wishbone B3总线Generic RAM写法
以下Verilog HDL代码符合wishbone总线B3标准协议,在Altera和Xilinx的开发工具上可以实现综合,自动推断并采用片上RAM资源,可以完成内存内容的初始化. /* ******* ...
- cpu gpu数据同步
https://developer.apple.com/documentation/metal/advanced_command_setup/cpu_and_gpu_synchronization d ...