[英]java concurrency Shared Data with Runnable vs Callable and local data
第一種情況:假設您有很多任務都返回某種結果,現在就將其稱為“結果”,這些都必須存儲在arraylist中。 有兩種選擇:
1)在main方法中創建一個arraylist,並使用可運行對象訪問共享列表和同步添加方法
2)在main方法中創建一個arraylist並使用callable來執行任務並返回結果,並讓main方法將Result添加到其列表中。
兩者之間是否存在性能差異,因為可運行對象需要同步訪問權限,而可調用對象卻不需要?
然后,回到第二種情況:現在讓我們說每個任務生成一個“小”數組列表,每個任務說少於10個項目。 這再次提供了兩個選項:
1)main和runnables中的一個arraylist,可以訪問共享列表,並在生成時添加結果項。
2)main和callables>中有一個arrayList,每個數組都有自己的本地arraylist,用於存儲結果,直到任務完成為止,然后在main中,addAll用於添加找到的結果。
和以前一樣,性能有何不同?
為了清楚起見,無論是在速度方面(一些同步問題等)還是在內存方面(由於本地較小的數組列表,可調用對象使用更多的內存還是因為內存太小而無法使用),性能都得到了體現?
For the First Case:
選項一:如果使用Runnable任務,則無法從run()方法返回任何內容。 因此,我認為此選項不適合您的要求。
選擇二:可打電話根據我對您的要求的理解,可打電話是不錯的選擇。 但是有一點變化,我們將創建一個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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.