مقدمة في البرمجة غير المتزامنة في Java
تتطلب التطبيقات الحديثة أداءً عاليًا واستجابة سريعة. المستخدمون ليسوا مستعدين للانتظار حتى يعالج التطبيق طلبًا إلى قاعدة البيانات أو ينفذ استدعاء شبكة. هنا يأتي دور البرمجة غير المتزامنة في Java - وهو نهج يسمح بعدم حظر سلسلة التنفيذ الرئيسية أثناء انتظار اكتمال العمليات الطويلة.
على عكس تعدد الخيوط التقليدي، حيث تدير الخيوط بشكل صريح، تقدم البرمجة غير المتزامنة تجريدات عالية المستوى. بدلاً من إنشاء خيوط جديدة يدويًا، تستخدم CompletableFuture و ExecutorService وأدوات أخرى توفرها Java Concurrency API.
في هذه المقالة، سنشرح المفاهيم الأساسية للبرمجة غير المتزامنة في Java مع أمثلة عملية. ستتعلم كيفية معالجة المهام غير المتزامنة، وربطها في سلاسل، والعمل بكفاءة مع تعدد الخيوط.
الأدوات الرئيسية للبرمجة غير المتزامنة في Java
1. CompletableFuture - أساس البرمجة غير المتزامنة
CompletableFuture هي فئة ظهرت في Java 8، وتوفر واجهة برمجة تطبيقات قوية للبرمجة غير المتزامنة. تسمح بإنشاء المهام غير المتزامنة، ودمجها، ومعالجة الأخطاء، وتحويل النتائج.
لنلقِ نظرة على مثال بسيط لإنشاء وتنفيذ مهمة غير متزامنة:
import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;
public class AsyncExample { public static void main(String[] args) throws ExecutionException, InterruptedException { // إنشاء مهمة غير متزامنة CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(1000); // محاكاة عملية طويلة } catch (InterruptedException e) { Thread.currentThread().interrupt(); } return "نتيجة العملية غير المتزامنة"; });
// إضافة معالج اكتمال future.thenAccept(result -> System.out.println("تم الحصول على النتيجة: " + result));
// يستمر الخيط الرئيسي في العمل System.out.println("الخيط الرئيسي يواصل التنفيذ");
// انتظار الاكتمال (للعرض فقط) future.get(); }}لاحظ أن supplyAsync() يستخدم افتراضيًا ForkJoinPool.commonPool(). هذا هو تجمع خيوط محسّن للمهام المتوازية.
2. ExecutorService - إدارة تجمع الخيوط
للتحكم الدقيق في تنفيذ المهام غير المتزامنة، استخدم ExecutorService. يتيح لك ذلك تحديد عدد الخيوط وسلوكها واستراتيجية معالجة المهام.
import java.util.concurrent.*;
public class ExecutorServiceExample { public static void main(String[] args) { // إنشاء تجمع من 4 خيوط ExecutorService executor = Executors.newFixedThreadPool(4);
// إنشاء CompletableFuture مع executor مخصص CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(2000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } return 42; }, executor);
// معالجة النتيجة future.thenAccept(result -> { System.out.println("النتيجة: " + result); executor.shutdown(); // مهم! إغلاق التجمع });
System.out.println("الخيط الرئيسي لا يتم حظره"); }}هام: قم دائمًا بإغلاق ExecutorService باستخدام shutdown() أو shutdownNow() لتجنب تسرب الموارد.