حالة الموضوع
مخطط حالة الموضوع:
يوضح:
وتشمل المواضيع الحالات الخمس التالية.
1. حالة جديدة : بعد إنشاء كائن الخيط ، يدخل الحالة الجديدة. على سبيل المثال ، مؤشر الترابط = موضوع جديد ().
2. Runnable: المعروف أيضًا باسم "الحالة القابلة للتنفيذ". بعد إنشاء كائن مؤشر الترابط ، تقوم مؤشرات الترابط الأخرى باستدعاء طريقة start () للكائن لبدء تشغيل مؤشر الترابط. على سبيل المثال ، thread.start (). قد يتم جدولة موضوع في حالة جاهزة للتنفيذ بواسطة وحدة المعالجة المركزية في أي وقت.
3. حالة التشغيل: يحصل مؤشر الترابط على أذونات وحدة المعالجة المركزية للتنفيذ. تجدر الإشارة إلى أن المواضيع يمكنها فقط إدخال حالة التشغيل من الحالة الجاهزة.
4. الحالة المحظورة: تعني الحالة المحظورة أن الخيط يتخلى عن حقوق استخدام وحدة المعالجة المركزية لسبب ما ويتوقف مؤقتًا عن التشغيل. ليس حتى يدخل الخيط إلى الحالة الجاهزة أن لديها فرصة للذهاب إلى حالة الجري. هناك ثلاثة أنواع من الانسداد:
(1) في انتظار حظر - عن طريق استدعاء طريقة WAIT () ، دع مؤشر الترابط ينتظر الانتهاء من عمل معين.
(2) الحظر المتزامن-فشل مؤشر ترابط في الحصول على قفل المزامنة المتزامنة (نظرًا لأن القفل يشغله مؤشرات ترابط أخرى) ، فسوف يدخل حالة حظر متزامنة.
(3) الحظر الآخر-سيدخل الخيط حالة حظر عن طريق استدعاء Sleep () أو الانضمام () من الموضوع أو إصدار طلب I/O. عندما تم توقيت Sleep () ، انتظرت الانضمام () لإنهاء الخيط أو توقيته ، أو تم الانتهاء من معالجة الإدخال/الإخراج ، حيث تم إعادة إدخال الخيط إلى الحالة الجاهزة.
5. الحالة الميتة: انتهى الخيط من تنفيذ أو الخروج من طريقة Run () بسبب استثناء ، وينهي الخيط دورة حياته.
تتضمن المحتويات المشاركة في هذه الحالات الخمسة فئة الكائنات والخيط والكلمات الرئيسية المتزامنة. سوف نتعلم هذه المحتويات واحدة تلو الأخرى في الفصول التالية.
فئة الكائن ، تحدد وظائف النوم/الاستيقاظ مثل wait () ، إخطار () ، إخطار () ، إلخ.
تحدد فئة الموضوع بعض وظائف تشغيل مؤشر ترابط العمود. على سبيل المثال ، Sleep () وظيفة النوم ، وظيفة المقاطعة () ، getName () الحصول على اسم الخيط ، إلخ.
المزامنة هي كلمة رئيسية. يتم تمييزه بواسطة كتل التعليمات البرمجية المتزامنة والطرق المتزامنة. تتمثل وظيفة متزامنة في السماح لمروح الحصول على قفل المزامنة للكائن.
عندما نقدم WAIT () ، والإخطار () والأساليب الأخرى بالتفصيل لاحقًا ، سنقوم بتحليل سبب تحديد "Wait () ، وإخطار () وطرق أخرى في فئة الكائن ، وليس فئة مؤشر الترابط."
طريقتان لتنفيذ الخيوط المتعددة: الخيط والتشغيل
Runnable هي واجهة تحتوي فقط على طريقة Run () واحدة فقط. تعريفه كما يلي:
الواجهة العامة Runnable {public Abstract void Run () ؛} دور Runnable ، ينفذ متعدد الخيوط. يمكننا تحديد الفئة A لتنفيذ واجهة Runnable ؛ ثم قم بإنشاء مؤشر ترابط جديد من خلال موضوع جديد (جديد A ()) وطرق أخرى.
الموضوع هو فئة. الموضوع نفسه ينفذ الواجهة القابلة للتشغيل. بيانها على النحو التالي:
سلاسل الفئة العامة تنفذ Runnable {}
دور الخيط هو إدراك متعدد الخيوط.
أوجه التشابه والاختلاف بين الخيط والركض:
التشابه بين الخيط و Runnable: كلاهما "طرق تنفيذ متعددة الخيوط".
الاختلافات بين الخيط و Runnable:
الموضوع هو فئة ، و Runnable هو واجهة. الموضوع نفسه هو فئة تنفذ الواجهة القابلة للتشغيل. نحن نعلم أن "الفئة يمكن أن تحتوي فقط على فئة الوالدين واحدة ، ولكن يمكنها تنفيذ واجهات متعددة" ، لذلك Runnable لديها قابلية التوسع بشكل أفضل.
بالإضافة إلى ذلك ، يمكن أيضًا استخدام Runnable ل "مشاركة الموارد". أي أنه يتم إنشاء مؤشرات ترابط متعددة استنادًا إلى كائن معين قابل للتشغيل ، وسيشاركون الموارد على الكائن القابل للتشغيل.
بشكل عام ، يوصى بتنفيذ متعدد الخيوط من خلال "Runnable"!
أمثلة متعددة مؤشرات الترابط للموضوع و Runnable
1. مثال على القراءة المتعددة من الموضوع
أدناه ، يمكننا فهم الخيط بشكل أفضل والتشغيل من خلال الأمثلة ، والاستخلاص على مثال عبر الإنترنت أكثر إقناعًا. // threadtest.java رمز المصدر
فئة myThread يمتد Thread {private int ticket = 10 ؛ public void run () {for (int i = 0 ؛ i <20 ؛ i ++) {if (this.ticket> 0) {system.out.println (this.getName ()+"tickets: ticket"+this.ticket--) ؛ }}}}} ؛ كل موضوع يبيع 10 تذاكر! mythread t1 = new MyThread () ؛ mythread t2 = new MyThread () ؛ mythread t3 = new MyThread () ؛ t1.start () ؛ t2.start () ؛ t3.start () ؛ }} نتائج التشغيل:
Thread-0 تذكرة البيع: Ticket10thread-1 بيع التذكرة: Ticket10thread-2 التذاكر البيع: Ticket10thread-1 تذكرة البيع: Micket9Thread-0 بيع التذاكر: Micket9Thread-1 بيع التذاكر: تذكرة 2Thread-2 التذكرة: بيع التذاكر: تذكرة-1ther-1 ticket7Thread-1 Ticket Selling: ticket4Thread-2 Ticket Selling: ticket7Thread-1 Ticket Selling: ticket3Thread-0 Tickets: ticket6Thread-1 Tickets: ticket2Thread-2 Tickets: ticket6Thread-2 Tickets: ticket5Thread-2 Tickets: ticket4Thread-1 Tickets: ticket1Thread-0 Tickets: ticket5Thread-2 Tickets: ticket3Thread-0 Tickets: ticket4Thread-2 Tickets: ticket2Thread-0 التذاكر: Ticket3Thread-0 التذاكر: Ticket1thread-0 التذاكر: Ticket2Thread-0 التذاكر: Ticket1thread-0 التذاكر: Ticket2Thread-0 التذاكر: Ticket1
وصف النتائج:
(1) يرث mythread من مؤشر الترابط ، وهو مؤشر ترابط مخصص. كل mythread تبيع 10 تذاكر.
(2) يخلق الخيط الرئيسي الرئيسي ويبدأ 3 مواضيع طفل mythread. كل خيط طفل يبيع 10 تذاكر.
2. مثال متعدد الإشراف على Runnable
بعد ذلك ، نقوم بتعديل البرنامج أعلاه. تنفيذ واجهة من خلال RunNable ، وبالتالي تنفيذ متعدد الخيوط.
// runnabletest.java code code class myThread تنفذ myTherable {private int ticket = 10 ؛ public void run () {for (int i = 0 ؛ i <20 ؛ i ++) {if (this.ticket> 0) {system.out.println (thread.currentThRead (). }}}}} ؛ الفئة العامة RunNableTest {public static void main (string [] args) {mythread mt = new MyThread () ؛ . الموضوع T1 = مؤشر ترابط جديد (MT) ؛ الموضوع T2 = مؤشر ترابط جديد (MT) ؛ الموضوع T3 = مؤشر ترابط جديد (MT) ؛ t1.start () ؛ t2.start () ؛ t3.start () ؛ }} نتائج التشغيل:
Thread-0 تذكرة بيع: Ticket10thread-2 بيع التذاكر: Ticket8Thread-1 تذكرة بيع: Ticket9thread-2 التذكرة البيع: Ticket6Thread-0 بيع التذكرة: تذكرة 2Ther-2 بيع التذاكر: تذكرة Ticket4thread-1 التذكرة: تذكرة Ticket5thread-2
وصف النتائج:
(1) على عكس ما ورد أعلاه "MyThread مورث من الخيط" ؛ هنا ينفذ MyThread واجهة الموضوع.
(2) يخلق الخيط الرئيسي الرئيسي ويبدأ 3 مؤشرات ترابط للأطفال ، ويتم إنشاء كل هذه الخيوط الثلاثة للأطفال استنادًا إلى "MT ، كائن Runnable". نتيجة العملية هي أن هذه الخيوط الثلاثة التي تباعت ما مجموعه 10 تذاكر. هذا يعني أنهم يشاركون واجهة mythread.