【问题标题】:java concurrency Shared Data with Runnable vs Callable and local datajava并发共享数据与Runnable vs Callable和本地数据
【发布时间】:2016-10-03 08:48:11
【问题描述】:

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

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

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

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

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

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

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

同样的问题,性能差异是什么?

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

【问题讨论】:

  • 为什么一定要ArrayList?
  • 依赖一个实现是不好的做法,你需要依赖接口来代替
  • 这取决于您的工作量。如果你有很多小任务,那么你应该关注锁开销。如果任务需要很长时间才能完成,那么首先考虑的应该是干净/可读的代码。

标签: java multithreading concurrency thread-safety shared-data


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

  2. 选项二:可调用 根据我对您要求的理解,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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多