
كيف نقوم بإنشاء خيط جديد
وراثة الصف Thread
الصف Thread هو صف جاهز بلغة الجافا قادر على إنشاء خيط جديد بشكل آلي كل ما على المبرمج من أجل الحصول على خيط جديد هو وراثة هذا الصف وإعادة كتابة الدالة run حيث يجب أن تضع فيها الكود المسؤول عن تنفيذ المهمة المطلوبة من الخيط الجديد كما يلي
/**
*
* @author Mutasem
*/
public class MyThread extends Thread {
@Override
public void run() {
// put your task here
}
}
ومن ثم قم بإنشاء كائن من هذا الصف ضمن الدالة main مثلاً واستدعي الدالة start
/**
*
* @author Mutasem
*/
public class MainClass {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
عند استدعاء الدالة start يتم بشكل آلي إنشاء خيط جديد يعمل في الخلفية ويقوم بتنفيذ الكود الموجود ضمن الدالة run.
تحقيق الواجهة Runnable
بدل وراثة الصف Thread قم بتحقيق الواجهة Runnable وقم بكتابة الدالة run وضع بداخلها الكود المطلوب من الخيط أن يقوم بتنفيذه.
/**
*
* @author Mutasem
*/
public class MyRunnable implements Runnable {
@Override
public void run() {
// put your task here
}
}
وبعد ذلك قم بإنشاء كائن من الصف الخاص بك في الدالةmain مثلاً ثم قم بإنشاء كائن من الصف Thread وقم بتمرير الكائن الخاص بك عبر الباني، ثم قم باستدعاء الدالة start كما يلي
/**
*
* @author Mutasem
*/
public class MainClass {
public static void main(String[] args) {
MyRunnable runnable=new MyRunnable();
Thread thread=new Thread(runnable);
thread.start();
}
}
مثال للتوضيح
ليكن لدينا الصف MyThread المعرف بالشكل التالي:
/**
*
* @author Mutasem
*/
public class MyThread extends Thread {
public static int counter;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
counter++;
}
}
}
حيث يمثل كل كائن من هذا الصف خيطاً يقوم بتنفيذ مهمة زيادة المتحول counter 10 مرات، ومن المهم الانتباه أن العضو البياني counter ستاتيكي بالتالي فهو مشترك بين جميع أغراض الصف MyThread.
وليكن لدينا الدالة main المعرفة ضمن الصف MainClass
/**
*
* @author Mutasem
*/
public class MainClass {
public static void main(String[] args) {
System.out.println("counter befor thread 1 start: " + MyThread.counter);
MyThread t1 = new MyThread();
t1.start();
System.out.println("counter befor thread 2 start: " + MyThread.counter);
MyThread t2 = new MyThread();
t2.start();
System.out.println("counter at the end of main " + MyThread.counter);
}
}
في بداية الدالة main قمنا بطباعة قيمة العداد وبما أننا لم نقم مطلقاً بزيادة العداد فإن القيمة هي 0, بعد ذلك قمنا بإنشاء خيط t1 واستدعاء الدالة start والتي ستعمل على زيادة العداد في الخلفية بمقدار 10، ثم قمنا بطباعة قيمة العداد قبل إنشاء الخيط الثاني t2، أخيراً قمنا بتشغيل الخيط الثاني عن طريق استدعاء الدالة start وفي نهاية الدالة main قمنا بطباعة القيمة النهائية للعداد لحظة انتهاء تنفيذ البرنامج.
والسؤال ماذا سيكون خرج البرنامج…
سأترك الجواب إلى القسم التالي وإلى ذلك الحين قم بتحميل المشروع وتشغيل المثال الموجود في الحزمة com.mutasemhajhasan.threading.example باستخدام برنامج netbeans ولاحظ النتيجة.
أعد التنفيذ بعد إزالة تعليق التعليمتين في الدالة main.
بعد أن قمت بالتنفيذ أصبحت جاهزاً للانتقال إلى القسم التالي من هذه السلسلة.
رابط السلسة على GitHub
https://github.com/mutasemhajhasan/Java-Multi-Threading
المراجع
Herbert Schildt. (2014). Java: the Complete Reference 9th Edition. New York, Chicago, San Francisco, Athens, London, Madrid, Mexico City: McGraw-Hill Education.