簡體   English   中英

java並發共享數據與Runnable vs Callable和本地數據

[英]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: 
  1. 選項一:如果使用Runnable任務,則無法從run()方法返回任何內容。 因此,我認為此選項不適合您的要求。

  2. 選擇二:可打電話根據我對您的要求的理解,可打電話是不錯的選擇。 但是有一點變化,我們將創建一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM