خيوط جافا
خيوط جافا
تسمح الخيوط للبرنامج بالعمل بكفاءة أكبر عن طريق القيام بأشياء متعددة في نفس الوقت.
يمكن استخدام الخيوط لأداء مهام معقدة في الخلفية دون مقاطعة البرنامج الرئيسي.
خلق موضوع
هناك طريقتان لإنشاء موضوع.
يمكن إنشاؤه عن طريق تمديد Thread
الفصل وتجاوز run()
طريقته:
تمديد بناء الجملة
public class Main extends Thread { public void run() { System.out.println("This code is running in a thread");
}}
هناك طريقة أخرى لإنشاء سلسلة رسائل وهي تنفيذ Runnable
الواجهة:
تنفيذ بناء الجملة
public class Main implements Runnable {
public void run() {
System.out.println("This code is running in a thread");
}
}
تشغيل المواضيع
إذا كانت الفئة توسع Thread
الفئة ، فيمكن تشغيل مؤشر الترابط عن طريق إنشاء مثيل للفئة واستدعاء أسلوبها start()
:
تمديد المثال
public class Main extends Thread {
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
إذا نفذت الفئة Runnable
الواجهة ، فيمكن تشغيل مؤشر الترابط عن طريق تمرير مثيل للفئة إلى Thread
مُنشئ كائن ثم استدعاء
start()
طريقة مؤشر الترابط:
تنفيذ المثال
public class Main implements Runnable {
public static void main(String[] args) {
Main obj = new Main();
Thread thread = new Thread(obj);
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
الاختلافات بين "تمديد" و "تنفيذ" المواضيع
يتمثل الاختلاف الرئيسي في أنه عندما تقوم فئة ما بتوسيع فئة Thread ، لا يمكنك تمديد أي فئة أخرى ، ولكن من خلال تنفيذ واجهة Runnable ، من الممكن التوسع من فئة أخرى أيضًا ، مثل: class MyClass extends OtherClass implements Runnable
.
مشاكل التزامن
نظرًا لأن الخيوط تعمل في نفس الوقت مع أجزاء أخرى من البرنامج ، فلا توجد طريقة لمعرفة الترتيب الذي سيتم تشغيل الكود به. عندما تقرأ المواضيع والبرنامج الرئيسي المتغيرات نفسها وتكتبها ، لا يمكن التنبؤ بالقيم. المشاكل التي تنتج عن ذلك تسمى مشاكل التزامن.
مثال
مثال على رمز حيث تكون قيمة المبلغ المتغير غير متوقعة:
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); System.out.println(amount); amount++; System.out.println(amount);
}public void run() { amount++;
}}
لتجنب مشاكل التزامن ، من الأفضل مشاركة أقل عدد ممكن من السمات بين سلاسل العمليات. إذا كانت السمات بحاجة إلى أن تكون مشتركة ، فإن أحد الحلول الممكنة هو استخدام isAlive()
طريقة الخيط للتحقق مما إذا كان مؤشر الترابط قد انتهى من العمل قبل استخدام أي سمات يمكن أن يغيرها مؤشر الترابط.
مثال
استخدم isAlive()
لمنع مشاكل التزامن:
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); // Wait for the thread to finish while(thread.isAlive()) { System.out.println("Waiting...");
}// Update amount and print its value System.out.println("Main: " + amount); amount++; System.out.println("Main: " + amount);
}public void run() { amount++;
}}