البرمجة غير المتزامنة في Java: دليل كامل للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في البرمجة غير المتزامنة في Java



تتطلب التطبيقات الحديثة أداءً عاليًا واستجابة سريعة. البرمجة غير المتزامنة في Java هي نهج يسمح بتنفيذ العمليات الطويلة (مثل استعلامات قاعدة البيانات، استدعاءات API، قراءة الملفات) دون حظر سلسلة التنفيذ الرئيسية. بدلاً من انتظار اكتمال المهمة، يستمر البرنامج في العمل، وتتم معالجة النتيجة عند جاهزيتها.



في هذا الدليل، سنشرح المفاهيم الأساسية للبرمجة غير المتزامنة في Java، بدءًا من الأدوات الأساسية وصولاً إلى واجهة API الحديثة CompletableFuture. ستتعلم كيفية إنشاء كود غير محظور، ومعالجة الأخطاء، ودمج المهام غير المتزامنة.



المفاهيم الأساسية: سلاسل التنفيذ و ExecutorService



سلاسل التنفيذ (Threads)



أبسط طريقة لتنفيذ كود بشكل غير متزامن في Java هي إنشاء سلسلة تنفيذ جديدة. ومع ذلك، فإن إنشاء سلاسل التنفيذ يدويًا هي عملية مكلفة، ومع وجود عدد كبير من المهام، قد يؤدي ذلك إلى مشاكل في الأداء.



// مثال على إنشاء سلسلة تنفيذThread thread = new Thread(() -> {    System.out.println("المهمة غير المتزامنة تُنفذ في السلسلة: " + Thread.currentThread().getName());});thread.start();System.out.println("السلسلة الرئيسية تواصل العمل");


ExecutorService — إدارة تجمع سلاسل التنفيذ



لإدارة سلاسل التنفيذ بكفاءة، توفر Java ExecutorService. هذه واجهة تسمح بإنشاء تجمعات لسلاسل التنفيذ، وإعادة استخدامها، والتحكم في تنفيذ المهام.



import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;

public class ExecutorServiceExample { public static void main(String[] args) { // إنشاء تجمع من 4 سلاسل تنفيذ ExecutorService executor = Executors.newFixedThreadPool(4); // إرسال مهمة للتنفيذ executor.submit(() -> { System.out.println("المهمة تُنفذ في تجمع سلاسل التنفيذ"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("المهمة اكتملت"); }); // إنهاء عمل التجمع executor.shutdown(); }}


الأنواع الرئيسية لتجمعات سلاسل التنفيذ:

  • newFixedThreadPool(n) — عدد ثابت من سلاسل التنفيذ.
  • newCachedThreadPool() — عدد ديناميكي من سلاسل التنفيذ.
  • newSingleThreadExecutor() — سلسلة تنفيذ واحدة لتنفيذ المهام بشكل تسلسلي.
  • newScheduledThreadPool(n) — لجدولة المهام مع تأخير.


Future و CompletableFuture



واجهة Future



Future هي واجهة تمثل نتيجة عملية غير متزامنة. تسمح بالتحقق مما إذا كانت المهمة قد اكتملت، وانتظار اكتمالها، والحصول على النتيجة.



import java.util.concurrent.*;

public class FutureExample { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> { Thread.sleep(2000); return 42; }); System.out.println("انتظار النتيجة..."); Integer result = future.get(); // يحظر السلسلة حتى الحصول على النتيجة System.out.println("النتيجة: " + result); executor.shutdown(); }}


عيوب Future — طريقة get() تحظر السلسلة. للعمل بشكل أكثر مرونة مع المهام غير المتزامنة، تم إنشاء CompletableFuture.



CompletableFuture — أداة قوية للبرمجة غير المتزامنة



CompletableFuture هي أداة قوية للبرمجة غير المتزامنة في Java. تسمح بإنشاء مهام غير متزامنة، ودمجها، ومعالجة الأخطاء، دون حظر سلاسل التنفيذ. توفر طرقًا مثل thenApply و thenAccept و exceptionally للعمل مع النتائج بشكل غير متزامن.

المدونات

توصيات الكتب