logo

دورة الحياة وحالات الخيط في Java

أ خيط في Java يمكن أن تتواجد في أي من الحالات التالية في أي وقت. يقع الخيط في إحدى الحالات المعروضة فقط في أي لحظة:

  1. الدولة الجديدة
  2. دولة قابلة للتشغيل
  3. الدولة المحظورة
  4. دولة الإنتظار
  5. حالة الانتظار المحددة بوقت
  6. الدولة المنتهية

يمثل الرسم البياني أدناه الحالات المختلفة للخيط في أي لحظة:

دورة الحياة وحالات الخيط في جافا' title=




دورة حياة الخيط 

هناك حالات متعددة للخيط في دورة الحياة كما هو مذكور أدناه:

  1. موضوع جديد: عندما يتم إنشاء موضوع جديد فإنه يكون في دولة جديدة . لم يبدأ تشغيل مؤشر الترابط بعد عندما يكون مؤشر الترابط في هذه الحالة. عندما يكون مؤشر الترابط في الحالة الجديدة، فإن التعليمات البرمجية الخاصة به لم يتم تشغيلها بعد ولم يبدأ تنفيذها.
  2. دولة قابلة للتشغيل : الخيط الذي هو جاهز للتشغيل يتم نقله إلى حالة قابلة للتشغيل. في هذه الحالة، قد يكون مؤشر الترابط قيد التشغيل بالفعل أو قد يكون جاهزًا للتشغيل في أي لحظة من الوقت. تقع على عاتق برنامج جدولة الخيط مسؤولية منح الخيط وقتًا للتشغيل. يخصص البرنامج متعدد الخيوط مقدارًا ثابتًا من الوقت لكل مؤشر ترابط على حدة. يحصل كل موضوع على قدر صغير من الوقت للتشغيل. بعد التشغيل لفترة من الوقت، يتوقف الخيط مؤقتًا ويتخلى عن وحدة المعالجة المركزية حتى يمكن تشغيل سلاسل الرسائل الأخرى.
  3. محظور: سيكون الخيط في حالة محظورة عندما يحاول الحصول على القفل ولكن حاليًا يتم الحصول على القفل بواسطة الخيط الآخر. سينتقل الخيط من الحالة المحظورة إلى الحالة القابلة للتشغيل عندما يحصل على القفل.
  4. حالة الإنتظار : سيكون الخيط في حالة انتظار عندما يدعو الانتظار () طريقة أو ينضم() طريقة. سوف ينتقل إلى الحالة القابلة للتشغيل عندما يتم إعلام مؤشر الترابط الآخر أو سيتم إنهاء هذا الخيط.
  5. الانتظار المحدد : يقع الخيط في حالة انتظار محددة التوقيت عندما يكون يستدعي أسلوبًا بمعلمة المهلة . يبقى مؤشر الترابط في هذه الحالة حتى انتهاء المهلة أو حتى تلقي إشعار. على سبيل المثال، عندما يستدعي مؤشر الترابط وضع السكون أو الانتظار المشروط، يتم نقله إلى حالة انتظار محددة بوقت.
  6. الدولة المنتهية: يتم إنهاء مؤشر الترابط لأحد الأسباب التالية: 
    • لأنه يخرج بشكل طبيعي. يحدث هذا عندما يتم تنفيذ كود الخيط بالكامل بواسطة البرنامج.
    • لأنه حدث خطأ غير عادي مثل خطأ تجزئة أو استثناء لم تتم معالجته.

حالات الموضوع في جافا

في Java للحصول على الحالة الحالية لاستخدام مؤشر الترابط الموضوع.getState() طريقة للحصول على الحالة الحالية للموضوع. توفر جافا java.lang.Thread.State التعداد الذي يحدد ثوابت ENUM لحالة مؤشر الترابط كملخص لها أدناه: 

1. جديد 

حالة مؤشر الترابط لموضوع لم يبدأ بعد. 

ابن آوى مقابل الذئب

Thread.State النهائي العام الثابت جديد

2. قابل للتشغيل 

حالة مؤشر الترابط لمؤشر ترابط قابل للتشغيل. يتم تنفيذ مؤشر ترابط في حالة قابلة للتشغيل في جهاز Java الظاهري ولكنه قد يكون في انتظار موارد أخرى من نظام التشغيل مثل المعالج. 

Thread.State النهائي العام الثابت RUNNABLE

3. محظور 

حالة الخيط لخيط محظور في انتظار قفل الشاشة. هناك مؤشر ترابط في الحالة المحظورة ينتظر قفل الشاشة لإدخال كتلة/طريقة متزامنة أو إعادة إدخال كتلة/طريقة متزامنة بعد الاتصال كائن. الانتظار (). 

روديارد كيبلينج إذا كان التفسير

الموضوع النهائي العام الثابت. الحالة محظورة

4. الانتظار 

 حالة مؤشر الترابط لمؤشر الترابط المنتظر. هناك مؤشر ترابط في حالة انتظار بسبب استدعاء إحدى الطرق التالية: 

  • Object.wait بدون مهلة
  • الموضوع. الانضمام مع عدم وجود مهلة
  • LockSupport.park

الموضوع النهائي العام الثابت. الحالة في انتظار

5. الانتظار في الوقت المحدد 

حالة مؤشر الترابط لمؤشر الترابط المنتظر مع وقت انتظار محدد. مؤشر الترابط في حالة انتظار محددة بوقت بسبب استدعاء إحدى الطرق التالية مع وقت انتظار إيجابي محدد: 

  • الموضوع.النوم
  • Object.wait مع انتهاء المهلة
  • Thread.join مع انتهاء المهلة
  • LockSupport.parkNanos
  • LockSupport.parkUntil

الموضوع النهائي الثابت العام. الحالة TIMED_WAITING

6. تم إنهاؤه 

حالة مؤشر الترابط لمؤشر الترابط المنتهي. لقد اكتمل تنفيذ الموضوع. 

تم إنهاء Thread.State النهائي العام الثابت


مثال لإظهار حالات الخيط

فيما يلي مثال حقيقي لنظام حجز التذاكر الذي يوضح حالات سلسلة الرسائل المختلفة:

مثال:

Java
// Java program to demonstrate thread states  // using a ticket booking scenario class TicketBooking implements Runnable {  @Override  public void run() {    try {    // Timed waiting  Thread.sleep(200);   } catch (InterruptedException e) {  e.printStackTrace();  }  System.out.println('State of bookingThread while mainThread is waiting: ' +  TicketSystem.mainThread.getState());  try {    // Another timed waiting  Thread.sleep(100);   } catch (InterruptedException e) {  e.printStackTrace();  }  } } public class TicketSystem implements Runnable {  public static Thread mainThread;  public static TicketSystem ticketSystem;  @Override  public void run() {  TicketBooking booking = new TicketBooking();  Thread bookingThread = new Thread(booking);  System.out.println('State after creating bookingThread: ' + bookingThread.getState());  bookingThread.start();  System.out.println('State after starting bookingThread: ' + bookingThread.getState());  try {  Thread.sleep(100);  } catch (InterruptedException e) {  e.printStackTrace();  }  System.out.println('State after sleeping bookingThread: ' + bookingThread.getState());  try {    // Moves mainThread to waiting state  bookingThread.join();   } catch (InterruptedException e) {  e.printStackTrace();  }  System.out.println('State after bookingThread finishes: ' + bookingThread.getState());  }  public static void main(String[] args) {  ticketSystem = new TicketSystem();  mainThread = new Thread(ticketSystem);  System.out.println('State after creating mainThread: ' + mainThread.getState());  mainThread.start();  System.out.println('State after starting mainThread: ' + mainThread.getState());  } } 


كيفية تحويل عدد صحيح إلى سلسلة جافا

الإخراج:

الإخراج' loading='lazy' title=


توضيح:

  • عندما يتم إنشاء مؤشر ترابط جديد، يكون مؤشر الترابط في الحالة الجديدة. عندما يتم استدعاء أسلوب start() على مؤشر ترابط، يقوم برنامج جدولة مؤشر الترابط بنقله إلى حالة قابلة للتشغيل.
  • عندما يتم استدعاء طريقة join() على مثيل مؤشر ترابط، ينتقل مؤشر الترابط الرئيسي إلى انتظار اكتمال مؤشر ترابط الحجز.
  • بمجرد اكتمال طريقة تشغيل مؤشر الترابط، تصبح حالته منتهية.
إنشاء اختبار