ما هي الخيوط؟
خيط (thread) هو مسار تنفيذ مستقل. تشغيل عدة خيوط ب允许 برنامجك ينفّذ مهام متعددة بنفس الوقت.
إنشاء خيط بـ Thread
class MyThread extends Thread {
@Override
public void run() {
System.out.println("يعمل في الخلفية: " + getName());
}
}
MyThread t = new MyThread();
t.start(); // يبدأ الخيط (لا تستدعي run مباشرة)
إنشاء بـ Runnable
الطريقة المفضّلة — تعزل المهمة عن إدارة الخيط:
Runnable task = () -> {
for (int i = 0; i < 5; i++) {
System.out.println("مهمة: " + i);
}
};
Thread t = new Thread(task);
t.start();
الانتظار والانضمام
Thread t = new Thread(() -> {
try { Thread.sleep(1000); }
catch (InterruptedException e) { Thread.currentThread().interrupt(); }
System.out.println("انتهى");
});
t.start();
t.join(); // ينتظر انتهاء الخيط t
System.out.println("تم الانتظار");
المشكلة: تعامل متزامن
// بدون synchronized — نتائج غير متوقعة:
class Counter {
int count = 0;
void increment() { count++; }
}
// مع synchronized — آمن:
class SafeCounter {
int count = 0;
synchronized void increment() { count++; }
}
synchronized على الكتل
synchronized (sharedObject) {
// كود يتطلب وصولًا حصريًا
}
خدمة ExecutorService
الطريقة العملية لإدارة مجموعة من الخيوط:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
ExecutorService pool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
int num = i;
pool.submit(() -> {
System.out.println("مهمة " + num + " على " + Thread.currentThread().getName());
});
}
pool.shutdown(); // ينتظر انتهاء كل المهام
CompletableFuture (طريقة حديثة)
import java.util.concurrent.CompletableFuture;
CompletableFuture.supplyAsync(() -> "مرحبًا")
.thenApply(s -> s + " بالعالم")
.thenAccept(System.out::println); // طباعة: مرحبًا بالعالم
متى نستخدم Multithreading؟
- مهام الخلفية: تحميل بيانات أو معالجة ملفات كبيرة.
- خوادم: خدمة عدة عملاء بنفس الوقت.
- تحسين الأداء: استغلال أنوية المعالج المتعددة.
⚠️ الخيوط تُضيف تعقيدًا كبيرًا — استخدم
ExecutorServiceأوCompletableFutureبدلThreadالمباشر قدر الإمكان.
🎯 التالي: خلاصة مسار Java.