مقدمة في البرمجة غير المتزامنة في Java
البرمجة غير المتزامنة هي نموذج تطوير لا يؤدي فيه تنفيذ العمليات الطويلة (مثل طلبات الشبكة، قراءة الملفات، أو العمليات الحسابية) إلى حظر الخيط الرئيسي للتطبيق. في Java، قطعت هذه المفهوم شوطًا طويلاً من التطور: من الخيوط الأساسية (Thread) إلى التجريدات القوية مثل CompletableFuture والتيارات التفاعلية.
في التطوير الحديث، تعتبر البرمجة غير المتزامنة أمرًا بالغ الأهمية لإنشاء خوادم ويب سريعة الاستجابة، وخدمات مصغرة عالية التحميل، ومعالجات بيانات فعالة. سيساعدك هذا الدليل على إتقان جميع الجوانب الرئيسية للبرمجة غير المتزامنة في Java، من الأساسيات إلى التقنيات المتقدمة.
الأساسيات: الخيوط و ExecutorService
مشكلة العمليات الحاجبة
الكود المتزامن التقليدي يحجب الخيط حتى اكتمال العملية. على سبيل المثال، عند تنفيذ طلب HTTP:
public String fetchData() throws InterruptedException { Thread.sleep(2000); // محاكاة طلب طويل return "تم استلام البيانات";}أثناء تنفيذ الطريقة fetchData()، لا يمكن للخيط معالجة الطلبات الأخرى. في التطبيقات متعددة الخيوط، يؤدي هذا إلى استخدام غير فعال للموارد.
ExecutorService — إدارة تجمع الخيوط
توفر Java ExecutorService لإدارة تجمع الخيوط. بدلاً من إنشاء خيوط جديدة يدويًا، يمكنك استخدام تجمع جاهز:
import java.util.concurrent.*;
public class ExecutorExample { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executor = Executors.newFixedThreadPool(4); Future<String> future = executor.submit(() -> { Thread.sleep(2000); return "نتيجة العملية الحسابية"; }); System.out.println("انتظار النتيجة..."); String result = future.get(); // يحجب الخيط حتى الحصول على النتيجة System.out.println("تم الاستلام: " + result); executor.shutdown(); }}مهم: Future.get() هي عملية حاجبة. للبرمجة غير المتزامنة الحقيقية، تحتاج إلى أدوات أكثر تقدمًا.
CompletableFuture: برمجة غير متزامنة قوية
بدءًا من Java 8، أصبح CompletableFuture الأداة الرئيسية للبرمجة غير المتزامنة. يسمح بإنشاء سلاسل من العمليات غير المتزامنة دون حظر الخيوط.
الإنشاء والعمليات الأساسية
import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;
public class CompletableFutureExample { public static void main(String[] args) throws ExecutionException, InterruptedException { // تنفيذ غير متزامن CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return "نتيجة غير متزامنة"; }); // معالجة النتيجة بدون حظر future.thenAccept(result -> System.out.println("تمت المعالجة: " + result)); System.out.println("الخيط الرئيسي يواصل العمل..."); // حظر لإنهاء البرنامج future.get(); }}السلاسل والتركيبات
واحدة من المزايا الرئيسية لـ CompletableFuture هي القدرة على بناء سلاسل معقدة من العمليات غير المتزامنة:
public class AsyncChainExample { public static void main(String[] args) throws ExecutionException, InterruptedException { CompletableFuture.supplyAsync(() -> { System.out.println("الخطوة 1: الحصول على البيانات"); return "user_123"; }) .thenApp