zoukankan      html  css  js  c++  java
  • 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
    ",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 
    ",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
    ");
                System.out.printf("Main:%s
    ",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
  • 相关阅读:
    Python生成器表达式
    Python列表解析
    Python迭代器(Iterator)
    Python set 集合
    python eval 函数妙用
    Python字典 (dict)
    Python序列之元组 (tuple)
    Python序列之列表 (list)
    递归和反射
    常用标准库
  • 原文地址:https://www.cnblogs.com/shamo89/p/9774810.html
Copyright © 2011-2022 走看看