Virtual Thread
الخيوط الافتراضية (Virtual Threads) Virtual Thread
خيط خفيف يديره الـ JVM بدل نظام التشغيل — يسمح بآلاف أو ملايين المهام المتزامنة المحجوبة على I/O بدون إنهاك الذاكرة.
الخيط التقليدي (يُسمى الآن platform thread) يقابل خيط نظام تشغيل حقيقي، يستهلك ميغابايتات من الذاكرة، فلا يمكن فتح عشرات الآلاف منه بأمان. منذ Java 21، الخيط الافتراضي (virtual thread) هو نفس نوع java.lang.Thread من ناحية الـ API، لكن الـ JVM يديره داخليًا: آلاف الخيوط الافتراضية تتشارك عددًا صغيرًا من خيوط المنصّة الحقيقية (carrier threads)، وعندما يُحجب خيط افتراضي بعملية إدخال/إخراج، الـ JVM يحرر خيط المنصّة تلقائيًا لخدمة خيط افتراضي آخر.
تزيد الإنتاجية (throughput) لا سرعة كل مهمة بمفردها، ومفيدة فقط للمهام المحجوبة على I/O (شبكة، قاعدة بيانات) لا المهام الحسابية المكثّفة.
الصياغة
Thread.ofVirtual().start(() -> { ... });
Thread.startVirtualThread(() -> { ... });
Executors.newVirtualThreadPerTaskExecutor();📄 مثال
import java.util.concurrent.*;
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < 10_000; i++) {
int taskId = i;
executor.submit(() -> {
System.out.println("مهمة " + taskId + " على " + Thread.currentThread());
});
}
} // ينتظر انتهاء كل المهام تلقائيًاأهم النقاط
| العنصر | الوظيفة |
|---|---|
| Thread.ofVirtual() | ينشئ Thread.Builder لخيط افتراضي |
| Thread.startVirtualThread(task) | طريقة مختصرة لإنشاء وتشغيل خيط افتراضي مباشرة |
| Executors.newVirtualThreadPerTaskExecutor() | خيط افتراضي جديد لكل مهمة تُرسل، بلا تجميع (pooling) |
| carrier thread | خيط المنصّة الحقيقي الذي يحمل خيطًا افتراضيًا أثناء تنفيذه |
💡 نصائح عملية
- استخدمها لخوادم بنمط "خيط لكل طلب" مع آلاف الاتصالات المحجوبة على شبكة أو قاعدة بيانات
- لا تستخدمها للمهام الحسابية المكثّفة (CPU-bound) — لا فائدة إضافية مقارنة بخيوط المنصّة
⚠️ أخطاء شائعة
- تجميعها (pooling) مثل خيوط المنصّة التقليدية — المفترض إنشاء خيط افتراضي جديد لكل مهمة بلا تجميع
- الاعتماد على synchronized حول عمليات حجب طويلة قبل Java 24 — قد يُثبّت (pin) الخيط على carrier ويفقد الميزة؛ استخدم ReentrantLock كبديل آمن عبر كل الإصدارات
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار JAVA الكامل بالعربي.