সম্পূরক ভবিষ্যত যোগদান বনাম পেতে


92

মধ্যে পার্থক্য কি CompletableFuture.get()এবং CompletableFuture.join()?

নীচে আমার কোডটি দেওয়া হয়েছে:

List<String> process() {

    List<String> messages = Arrays.asList("Msg1", "Msg2", "Msg3", "Msg4", "Msg5", "Msg6", "Msg7", "Msg8", "Msg9",
            "Msg10", "Msg11", "Msg12");
    MessageService messageService = new MessageService();
    ExecutorService executor = Executors.newFixedThreadPool(4);

    List<String> mapResult = new ArrayList<>();

    CompletableFuture<?>[] fanoutRequestList = new CompletableFuture[messages.size()];
    int count = 0;
    for (String msg : messages) {
        CompletableFuture<?> future = CompletableFuture
                .supplyAsync(() -> messageService.sendNotification(msg), executor).exceptionally(ex -> "Error")
                .thenAccept(mapResult::add);

        fanoutRequestList[count++] = future;
    }

    try {
        CompletableFuture.allOf(fanoutRequestList).get();
      //CompletableFuture.allOf(fanoutRequestList).join();
    } catch (InterruptedException | ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return mapResult.stream().filter(s -> !s.equalsIgnoreCase("Error")).collect(Collectors.toList());
}

আমি উভয় পদ্ধতি দিয়ে চেষ্টা করেছি কিন্তু ফলাফলের মধ্যে কোনও পার্থক্য দেখছি না।


9
get()আপনার চেক করা ব্যতিক্রমগুলি ধরা দরকার। আপনি পরিবর্তিত হওয়ার সময় আপনার পার্থক্যটি লক্ষ্য করা উচিত , কারণ আপনি get()উদ্দেশ্যমূলকভাবে join()একটি সংকলক ত্রুটি পেয়ে যাবেন তা InterruptedExceptionনয় যে ব্লকের মধ্যেও ExecutionExceptionফেলে দেওয়া হবে না try
হোলার

4
@ হোলি-জাভা: join()বাধা পেতে পারে না।
হলগার

@ হোলার হ্যাঁ, স্যার। আমি খুঁজে পেয়েছি যে আমি এই কাজে বাধা দিতে পারি না।
হোলি-জাভা

8
ভাল getবিদ্যমান, কারণ ইন্টারফেস CompletableFutureপ্রয়োগ করে Futureযা এটি আদেশ করে। join()ফিউচারের সংমিশ্রণের সময় ল্যাম্বডা এক্সপ্রেশনগুলিতে চেক করা ব্যতিক্রমগুলি ধরার প্রয়োজন এড়াতে সম্ভবত বেশিরভাগ ক্ষেত্রেই পরিচয় করা হয়েছে। অন্যান্য সমস্ত ব্যবহারের ক্ষেত্রে, আপনি যা পছন্দ করেন তা নির্দ্বিধায় ব্যবহার করুন।
হোলার

4
থ্রেডে দু'টি ব্লক হিসাবে যোগ দেওয়া বা পেতে ব্যবহার করা কি আসলেই বোধগম্য? পরিবর্তে অ্যাসিঙ্ক্রোনাস ফাংশনগুলির একটি শৃঙ্খলা তৈরির জন্য অন্যান্য রচনা পদ্ধতি ব্যবহার করে আমরা এই অ্যাসিনক্রোনাস করতে পারি না v এটি কার্যকারিতার উপর নির্ভর করে। তবে উদাহরণস্বরূপ, বসন্তকালে কোনও পরিষেবা পদ্ধতির মাধ্যমে নিয়ন্ত্রক পদ্ধতিটি সম্পূর্ণ ভবিষ্যতের প্রত্যাবর্তন করে, এটি কল করা বা পরিষেবা পদ্ধতিতে যোগদান করা মোটেই বোঝা যায় না?
শৈলেশ বৈশম্পায়ন

উত্তর:


105

পার্থক্য হ'ল পদ্ধতিগুলি কীভাবে ব্যতিক্রম ছুঁড়ে। ইন্টারফেস হিসাবে হিসাবে get()ঘোষণা করা Futureহয়

V get() throws InterruptedException, ExecutionException;

ব্যতিক্রমগুলি উভয়ই চেক করা ব্যতিক্রম যার অর্থ তাদের আপনার কোডে পরিচালনা করা দরকার। আপনি যেমন আপনার কোডটিতে দেখতে পাচ্ছেন আপনার আইডিইতে একটি স্বয়ংক্রিয় কোড জেনারেটর আপনার পক্ষ থেকে ট্রাই-ক্যাচ ব্লক তৈরি করার জন্য জিজ্ঞাসা করেছিল।

try {
  CompletableFuture.allOf(fanoutRequestList).get() 
} catch (InterruptedException | ExecutionException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}

join()পদ্ধতি নিক্ষেপ না চেক করা ব্যতিক্রম।

public T join()

এর পরিবর্তে এটি ছোঁড়ার অবারিত CompletionException। সুতরাং আপনার exceptionally()ট্রাই -ক্যাচ ব্লকের প্রয়োজন নেই এবং পরিবর্তে বিযুক্ত List<String> processফাংশনটি ব্যবহার করার সময় আপনি পুরোপুরি পদ্ধতিটি ব্যবহার করতে পারেন

CompletableFuture<List<String>> cf = CompletableFuture
    .supplyAsync(this::process)
    .exceptionally(this::getFallbackListOfStrings) // Here you can catch e.g. {@code join}'s CompletionException
    .thenAccept(this::processFurther);

আপনি উভয় get()এবং join()বাস্তবায়ন এখানে পেতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.