Sobes.tech
Middle

Чӣ тавр CompletableFuture дар Java лозим аст?

sobes.tech AI

Ҷавоб аз AI

CompletableFuture برای اجرای ناهمزمان وظایف و ترکیب عملیات ناهمزمان استفاده می‌شود. این نتیجه یک عملیات ناهمزمان است که ممکن است در آینده تکمیل شود.

مزایای اصلی و دلایل استفاده:

  • اجرای ناهمزمان: امکان اجرای وظایف در پس‌زمینه، بدون مسدود کردن جریان اصلی.
  • ترکیب عملیات ناهمزمان: امکان اتصال چندین وظیفه ناهمزمان، تعیین نحوه اجرای آنها به صورت متوالی یا موازی، و پردازش نتایج آنها.
  • پردازش استثناها: ارائه مکانیزم‌هایی برای مدیریت خطاها در وظایف ناهمزمان.
  • انعطاف‌پذیری: پشتیبانی از روش‌های مختلف برای پردازش نتیجه (مثلاً، استفاده از تابع، اجرای وظیفه بعدی) و تعیین جریان‌های اجرا.

نمونه‌های استفاده:

  1. اجرای چندین وظیفه مستقل به صورت موازی و انتظار برای اتمام آنها:

    // نمونه اجرای موازی دو وظیفه
    CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
        // عملیات طولانی ۱
        return "نتیجه ۱";
    });
    
    CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
        // عملیات طولانی ۲
        return "نتیجه ۲";
    });
    
    CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2);
    
    combinedFuture.join(); // انتظار برای اتمام هر دو وظیفه
    
  2. اجرای متوالی عملیات ناهمزمان:

    // نمونه اجرای متوالی وظایف
    CompletableFuture<String> initialFuture = CompletableFuture.supplyAsync(() -> "مقدار اولیه");
    
    CompletableFuture<Integer> transformedFuture = initialFuture.thenApplyAsync(result -> {
        // تبدیل نتیجه
        return result.length();
    });
    
    transformedFuture.thenAccept(length -> {
        System.out.println("طول رشته: " + length);
    });
    
  3. پردازش استثناها:

    // نمونه پردازش استثنا
    CompletableFuture<String> errorFuture = CompletableFuture.supplyAsync(() -> {
        if (true) {
            throw new RuntimeException("خطا رخ داد");
        }
        return "موفقیت";
    }).exceptionally(ex -> {
        System.err.println("پردازش خطا: " + ex.getMessage());
        return "خطای پردازش شده"; // مقدار جایگزین
    });
    
    System.out.println(errorFuture.join());