Java Academy · درس

ما الخيوط الافتراضية

خيوط خفيفة في Java 21

الدرس 1 من 413 خطوة

ما الخيوط الافتراضية درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

مرحبًا بكم في الخيوط الافتراضية

وصلت الخيوط الافتراضية كميزة نهائية في Java 21 (JEP 444). وهي خيوط خفيفة تديرها آلة JVM بدلًا من نظام التشغيل.

الهدف بسيط: إتاحة كتابة كود مباشر بأسلوب خيط لكل طلب، مع الاستمرار في التوسع لدعم ملايين المهام المتزامنة.

المشكلة القديمة

يرتبط الخيط المنصّي التقليدي بخيط واحد في نظام التشغيل ارتباطًا مباشرًا. ويستهلك كل خيط نحو ميغابايت من المكدس، كما أن إنشاءه مكلف.

وهذا يعني أنه لا يمكنكم تشغيل سوى بضعة آلاف في الوقت نفسه. كما أن عمليات الإدخال والإخراج الحاجبة تشغل خيطًا كاملًا في نظام التشغيل أثناء الانتظار.

اختلاف الخيوط الافتراضية

لا يمتلك الخيط الافتراضي خيطًا في نظام التشغيل. إذ تُوزَّع خيوط افتراضية عديدة على مجموعة صغيرة من الخيوط المنصّية الحاملة.

  • رخيصة الإنشاء، إذ يمكن إنشاء آلاف منها في كل ميلي ثانية
  • استهلاك ضئيل جدًا للذاكرة
  • يؤدي الحجب ببساطة إلى إيقاف الخيط الافتراضي مؤقتًا، مما يحرر الخيط الحامل

التثبيت والإلغاء

عندما يعمل خيط افتراضي، يتم تثبيته على خيط حامل. وعندما يواجه عملية حاجبة، يتم إلغاء تثبيته، فيحرر الخيط الحامل كي يتابع عمل آخر التنفيذ.

تحدث عملية الإيقاف والاستئناف هذه تلقائيًا. ويظل كودكم شبيهًا بكود الحجب العادي.

أول خيط افتراضي

إليكم أبسط مثال ممكن. يبدأ Thread.ofVirtual().start(...) خيطًا افتراضيًا، بينما تنتظر join() انتهاءه.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread vt = Thread.ofVirtual().start(() ->
            System.out.println("Hello from a virtual thread!"));
        vt.join();
        System.out.println("Main is done.");
    }
}

التأكد من أنه افتراضي

يوفّر كل Thread الطريقة isVirtual(). ويتيح لكم ذلك التحقق من نوع الخيط الذي يعمل عليه كودكم.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread vt = Thread.ofVirtual().start(() -> {
            System.out.println("isVirtual: " + Thread.currentThread().isVirtual());
        });
        vt.join();
    }
}

التوسع لدعم مهام كثيرة

نظرًا إلى انخفاض تكلفة الخيوط الافتراضية، فمن الطبيعي تمامًا تشغيل عشرات الآلاف منها. وهنا ننشئ 10,000 خيط منها.

import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        AtomicInteger counter = new AtomicInteger();
        Thread[] threads = new Thread[10_000];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = Thread.ofVirtual().start(counter::incrementAndGet);
        }
        for (Thread t : threads) t.join();
        System.out.println("Completed: " + counter.get());
    }
}

تسمية الخيوط الافتراضية

يمكنكم تسمية خيط افتراضي لتسهيل تصحيح الأخطاء باستخدام المُنشئ قبل بدء تشغيله.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread vt = Thread.ofVirtual()
                .name("worker-1")
                .start(() ->
                    System.out.println("Running on: " + Thread.currentThread().getName()));
        vt.join();
    }
}

واجهة برمجة التطبيقات نفسها، ومحرّك جديد

تطبّق الخيوط الافتراضية واجهة برمجة التطبيقات Thread نفسها تمامًا التي تعرفونها. وما زلتم تستخدمون start وjoin وsleep وinterrupt.

وهذا يعني أن المكتبات الحالية المبنية على Thread وRunnable تعمل دون تغييرات.

متى تُستخدم

تتألق الخيوط الافتراضية في أعباء العمل المقيّدة بعمليات الإدخال والإخراج، مثل خوادم الويب واستدعاءات قواعد البيانات وطلبات واجهات API البعيدة.

لكنها ليست أسرع في العمليات الحسابية المقيّدة بالمعالج. ففي هذه الحالة، يظل عدد الأنوية هو العامل المحدِّد.

ليست تجمّعًا

هناك تغيير أساسي في طريقة التفكير: لا تُنشئ تجمّعًا للخيوط الافتراضية. أنشئ خيطًا جديدًا لكل مهمة، ودعه ينتهي عند اكتمال المهمة.

تُستخدم تجمّعات الخيوط لإعادة استخدام الموارد المكلفة. أما الخيوط الافتراضية فهي منخفضة التكلفة، لذا فإن تجميعها يُعد نمطًا غير مناسب.

اختبار سريع

اختبر مدى فهمك للخيوط الافتراضية.

مراجعة

لقد تعلمت ماهية الخيوط الافتراضية وسبب أهميتها:

  • خفيفة الوزن وتديرها JVM، وأصبحت نهائية في Java 21
  • تُوزَّع على الخيوط الحاملة عبر عمليتي mount وunmount
  • مثالية لأعمال الإدخال والإخراج المكثفة ذات التزامن العالي
  • تستخدم واجهة API نفسها الخاصة بـ Thread، لكن يُنشأ خيط لكل مهمة بدلًا من تجميع الخيوط

ستتعلم بعد ذلك الطرق المختلفة لإنشائها.

البدء مجانًا

تعلم Java مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
104
الدروس
374

الأسئلة الشائعة

هل درس «ما الخيوط الافتراضية» مجاني؟

نعم — نص درس «ما الخيوط الافتراضية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «ما الخيوط الافتراضية»؟

خيوط خفيفة في Java 21 تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «ما الخيوط الافتراضية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ما الخيوط الافتراضية
  2. إنشاء الخيوط الافتراضية
  3. الخيوط المنصّية مقابل الافتراضية
  4. المزالق: التثبيت وThreadLocals
← العودة إلى Java Academy