إنشاء CompletableFutures وإكمالها
استخدم supplyAsync وrunAsync وcompletedFuture، وأكمل futures يدويًا باستخدام complete وcompleteExceptionally
إنشاء CompletableFutures وإكمالها درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
ما هي CompletableFuture؟
تمثّل CompletableFuture<T> (في Java 8 فأحدث) عملية حسابية غير متزامنة يمكن إكمالها وربطها ودمجها صراحةً. وهي تطبّق كلًا من Future وCompletionStage.
supplyAsync: بدء عملية حسابية غير متزامنة
ينفّذ CompletableFuture.supplyAsync() كائن Supplier في ForkJoinPool المشترك، ويعيد future يحتوي على النتيجة.
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// runs on ForkJoinPool.commonPool()
return fetchDataFromNetwork();
});
System.out.println("Non-blocking — this runs immediately");runAsync: التنفيذ دون انتظار النتيجة
ينفّذ runAsync() كائن Runnable بشكل غير متزامن، ويعيد CompletableFuture<Void>. استخدمه عندما لا تحتاج إلى نتيجة.
CompletableFuture<Void> task = CompletableFuture.runAsync(() ->
sendEmail("user@example.com", "Welcome!"));
task.thenRun(() -> System.out.println("Email sent"));Executor مخصص
مرّر Executor مخصصًا للتحكّم في تجمع الخيوط المستخدم للعملية الحسابية — وهذا ضروري في تطبيقات الويب التي تريد فيها تجنّب حجب التجمع المشترك.
ExecutorService pool = Executors.newFixedThreadPool(10);
CompletableFuture<User> future = CompletableFuture.supplyAsync(
() -> userService.findById(42L), pool
);completedFuture: قيمة مكتملة مسبقًا
تعيد CompletableFuture.completedFuture(value) future مكتملًا مسبقًا. وهي مفيدة للاختبار أو عندما تكون لديك قيمة فورية تريد إرجاعها في مسار غير متزامن.
CompletableFuture<String> cached = CompletableFuture.completedFuture("cached-value");
cached.thenAccept(System.out::println); // runs immediatelyإكمال Future يدويًا
استخدم complete() لتوفير النتيجة من خارج العملية الحسابية. واستخدم completeExceptionally() للإشارة إلى حدوث فشل.
CompletableFuture<String> promise = new CompletableFuture<>();
// In another thread or callback:
promise.complete("done!"); // signals success
// promise.completeExceptionally(new RuntimeException("fail")); // signals failure
String result = promise.get(); // blocks until completedget() وjoin()
يحجب كل من get() وjoin() التنفيذ حتى يكتمل future. يطرح get() استثناءات مفحوصة، بينما يغلّفها join() داخل CompletionException غير مفحوص.
try {
String r = future.get(5, TimeUnit.SECONDS); // checked exceptions
} catch (TimeoutException | InterruptedException | ExecutionException e) { ... }
// Or:
String r = future.join(); // throws CompletionException (unchecked)getNow() للتحقّق دون حجب
تعيد getNow(defaultValue) النتيجة إذا كان future مكتملًا مسبقًا، أو القيمة الافتراضية المقدَّمة إذا لم يكن مكتملًا — دون حجب أو انتظار.
String result = future.getNow("loading...");
System.out.println(result); // "loading..." if not yet doneisDone وisCancelled وisCompletedExceptionally
تحقّق من حالة future دون حجب التنفيذ. ادمج عمليات التحقّق هذه في حلقات الاستطلاع أو شيفرة المراقبة.
if (future.isDone()) System.out.println("Completed");
if (future.isCancelled()) System.out.println("Cancelled");
if (future.isCompletedExceptionally()) System.out.println("Failed");cancel() لمعالجة المهلات
استدعِ cancel(true) لإلغاء عملية حسابية قيد التنفيذ. ينتقل future إلى حالة الإلغاء، ويطرح أي استدعاء محجوب لـ get() الاستثناء CancellationException.
CompletableFuture<String> future = fetchAsync();
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(() -> future.cancel(true), 3, TimeUnit.SECONDS);completeOnTimeout (في Java 9 فأحدث)
تُكمل completeOnTimeout(value, timeout, unit) future تلقائيًا بقيمة افتراضية إذا لم يكتمل ضمن المهلة — وهي أنظف من الإلغاء اليدوي.
CompletableFuture<String> result = fetchAsync()
.completeOnTimeout("default", 3, TimeUnit.SECONDS);
System.out.println(result.join()); // "default" if fetch took > 3sتحقّق سريعًا
ما الأسلوب الذي يبدأ عملية حسابية غير متزامنة في ForkJoinPool المشترك ويعيد قيمة؟
مراجعة
يبدأ supplyAsync وrunAsync العمل غير المتزامن. ويُكمل complete وcompleteExceptionally العملية يدويًا. استخدم join() للحجب الذي يطرح استثناءات غير مفحوصة. ويتعامل completeOnTimeout مع المهلات بطريقة واضحة.
الأسئلة الشائعة
هل درس «إنشاء CompletableFutures وإكمالها» مجاني؟
نعم — نص درس «إنشاء CompletableFutures وإكمالها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «إنشاء CompletableFutures وإكمالها»؟
استخدم supplyAsync وrunAsync وcompletedFuture، وأكمل futures يدويًا باستخدام complete وcompleteExceptionally تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «إنشاء CompletableFutures وإكمالها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إنشاء CompletableFutures وإكمالها
- التسلسل باستخدام thenApply وthenCompose
- دمج Futures: allOf وanyOf
- معالجة الأخطاء وخط أنابيب HTTP غير المتزامن