0

第一种情况:假设您有很多任务都返回某种结果,现在我们称之为“结果”,这些都必须存储在数组列表中。有两种选择:

1)在main方法中创建一个arraylist,并使用可访问共享列表的runnables和一个同步的add方法

2)在main方法中创建一个arraylist,并使用callable执行任务并返回结果,让main方法将Result添加到它的列表中。

两者之间是否存在任何性能差异,因为可运行对象需要同步访问,但可调用对象不需要?

然后,对于第二种情况:现在假设每个任务生成一个“小”数组列表,假设每个任务少于 10 个项目。这再次提供了两个选项:

1) main 和 runnables 中的一个 arraylist 可以访问共享列表,该列表在生成时添加结果项。

2) main 和 callables> 中有一个 arrayList,每个都有自己的本地 arraylist,用于存储结果,直到任务完成,然后在 main 中使用 addAll 来添加找到的结果。

和以前一样的问题,性能差异是什么?

为了清楚起见,速度(一些同步问题等)和内存方面的性能(由于本地小数组列表,可调用对象是否使用更多内存,或者这个小到可以忽略不计)?

4

1 回答 1

0
For the First Case: 
  1. 选项一:如果我们使用 Runnable 任务,那么我们无法从 run() 方法返回任何内容。所以我认为这个选项不适合你的要求。

  2. 选项二:Callable 根据我对您的要求的理解,Callable 是不错的候选人。但是有一点变化,我们将创建一个 Future 列表,并且对于每个 Callable 任务(我们将提交给执行者)将这个 Callable 的 Future 结果(详见下面的代码)添加到这个列表中。然后每当我们需要任何任务的结果时,我们都可以从对应的 Future 中获取结果。

类 MainTaskExecutor {

private static ExecutorService  exe = Executors.newCachedThreadPool();
private static List<Future<Result>> futureResults = new ArrayList<>();

public static void main(String[] args) throws ExecutionException, InterruptedException {
    Callable<Result> dummyTask = ()-> {
        System.out.println("Task is executed");
        Result dummyResult = new Result();
        return dummyResult;
    };

    //Submit a task
    submitTask(dummyTask);

    //Getting result of "0" index
    System.out.println(futureResults.get(0).get());
}

private static void submitTask(Callable<Result> task) {
    futureResults.add(exe.submit(task));
}

private static Result getResult(int taskNumber) throws ExecutionException, InterruptedException {
    return futureResults.get(taskNumber).get();
}

}

class Result {
    // data to be added
}
于 2016-06-03T16:19:15.940 回答