دروس جافا

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

طرق جافا

طرق جافا معلمات طريقة جافا طريقة جافا التحميل الزائد نطاق جافا العودية جافا

فئات جافا

جافا OOP فئات / كائنات جافا سمات فئة Java طرق فئة جافا منشئو جافا معدِّلات جافا تغليف جافا حزم جافا / API الوراثة جافا جافا تعدد الأشكال فئات جافا الداخلية جافا التجريد واجهة جافا جافا Enums مدخلات مستخدم جافا تاريخ جافا جافا ArrayList جافا لينكدليست جافا HashMap جافا هاشسيت جافا التكرار فئات Java Wrapper استثناءات Java جافا RegEx خيوط جافا جافا لامدا

معالجة ملفات جافا

ملفات جافا جافا إنشاء / كتابة الملفات ملفات قراءة جافا جافا حذف الملفات

جافا كيف

أضف عددين

مرجع جافا

كلمات جافا طرق سلسلة جافا طرق جافا للرياضيات

أمثلة جافا

أمثلة جافا مترجم جافا تمارين جافا مسابقة جافا شهادة جافا


خيوط جافا


خيوط جافا

تسمح الخيوط للبرنامج بالعمل بكفاءة أكبر عن طريق القيام بأشياء متعددة في نفس الوقت.

يمكن استخدام الخيوط لأداء مهام معقدة في الخلفية دون مقاطعة البرنامج الرئيسي.


خلق موضوع

هناك طريقتان لإنشاء موضوع.

يمكن إنشاؤه عن طريق تمديد 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++;
  }
}