Java:并行处理数组,找出异常发生的位置

时间:2016-04-19 00:21:42

标签: java arrays parallel-processing executorservice callable

首先,我有一个数组,其中填充0,除了位置5,其中填充了“a”(故意放在那里抛出NumberFormatException)。

然后我调用testMethod传递数组,数组的大小以及可用的Callables数。

在此示例中,数组的大小为10,并且有4个callables ..数组以块的形式处理:

第一个块是位置0和1 第二个块是位置2和3 第三块是第4和第5位 第四大块是第6和第7位 第五块是第8和第9位 第六大块是位置10

我需要找出NumberFormatException发生的位置,或者更一般的意义:我需要知道发生异常时的位置。

所以我可以在消息“在第5位发生执行异常”

中打印出来

我很擅长使用ExceutorService / Callables,所以我不太清楚如何实现这个目标......

如果使用我当前的设置无法实现...是否有类似的方法来执行此并行处理,这也使我能够找到发生异常的位置?

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class ThreadTest {

    private final static ArrayList<Callable<Boolean>> mCallables = new ArrayList<>();
    private final static ExecutorService mExecutor = Executors.newFixedThreadPool(4);

    public static void main(String[] args) throws Exception {
        /*Fill the array with 0's, except for position 5 which is a letter and will throw number format exception*/
        final String[] nums = new String[10];
        for (int i = 0; i < 5; i++) {
            nums[i] = "0";
        }
        nums[5] = "a";
        for (int i = 6; i < nums.length; i++) {
            nums[i] = "0";
        }

        testMethod(nums, 10, 4);
    }

    static void testMethod(String[] nums, int size, int processors) throws Exception {

        mCallables.clear();

        int chunk = (size / processors) == 0 ? size : size / processors;
        System.out.println("Chunk size: "+chunk);

        for (int low = 0; low < size; low += chunk) {

            final int start = low;
            final int end = Math.min(size, low + chunk);

            mCallables.add(new Callable<Boolean>() {

                @Override
                public Boolean call() throws Exception {

                    System.out.println("New call");
                    for (int pos = start; pos < end; pos++) {
                        System.out.println("Pos is " + pos);

                        System.out.println("Num is " + nums[pos]);
                        double d = Double.parseDouble(nums[pos]);

                    } //end inner loop


                    return true;
                } //end call method

            }); //end callable anonymous class
        }

        try {
            List<Future<Boolean>> f = mExecutor.invokeAll(mCallables);

            for (int i = 0; i < f.size(); i++) {
                f.get(i).get();
            }


        } catch (ExecutionException e) {
            String s = e.toString();
            System.out.println(s);
            System.out.println("Execution exception"); //need to write here which pos the numberFormat exception occurred 
        }


        mExecutor.shutdown();
    }
}

1 个答案:

答案 0 :(得分:0)

你不能在Double.parseDouble行添加try / catch并抛出包含该位置的异常吗?