انسخ رمز الكود كما يلي:
// ابدأ الموضوع
بداية الفراغ العام ()؛
تشغيل الفراغ العام ()؛
// تعليق وتنشيط المواضيع
استئناف الفراغ العام () // غير مستحسن للاستخدام
تعليق الفراغ العام () // غير مستحسن للاستخدام
نوم الفراغ الثابت العام (مللي طويل) ؛
نوم الفراغ الثابت العام (مللي طويل، عدد صحيح من النانو)؛
// إنهاء الموضوع
توقف الفراغ العام () // غير مستحسن للاستخدام
مقاطعة الفراغ العام ()؛
// الحصول على حالة الموضوع
المنطقية العامة isAlive();
يتم مقاطعة المنطق المنطقي العام () ؛
تمت مقاطعة منطقية ثابتة عامة () ؛
// طريقة الانضمام
انضمام الفراغ العام () يلقي InterruptedException؛
1. إنشاء وتشغيل المواضيع
لا ينفذ الخيط التعليمات البرمجية في طريقة التشغيل مباشرة بعد إنشائها، ولكنه في حالة انتظار. عندما يكون الخيط في حالة الانتظار، يمكنك تعيين سمات مختلفة للخيط من خلال أساليب فئة الخيط، مثل أولوية الخيط (setPriority)، واسم الخيط (setName)، ونوع الخيط (setDaemon).
عندما يتم استدعاء طريقة البدء، يبدأ الخيط في تنفيذ التعليمات البرمجية في طريقة التشغيل. يدخل الخيط في حالة التشغيل. يمكنك استخدام أسلوب isAlive لفئة Thread لتحديد ما إذا كان مؤشر الترابط قيد التشغيل. عندما يكون الخيط في حالة التشغيل، يُرجع isAlive صحيحًا. عندما يُرجع isAlive خطأ، قد يكون الخيط في حالة الانتظار أو في حالة التوقف. يوضح التعليمة البرمجية التالية التبديل بين الحالات الثلاث لإنشاء مؤشر الترابط، والتشغيل والإيقاف، وإخراج قيمة الإرجاع المقابلة isAlive.
انسخ رمز الكود كما يلي:
حزمة الفصل 2؛
تقوم دورة حياة الفئة العامة بتمديد الموضوع
{
تشغيل الفراغ العام ()
{
كثافة العمليات ن = 0؛
بينما ((++n) < 1000);
}
يلقي الفراغ الرئيسي العام (String[] args) استثناءً
{
LifeCycle thread1 = new LifeCycle();
System.out.println("isAlive: " + thread1.isAlive());
Thread1.start();
System.out.println("isAlive: " + thread1.isAlive());
thread1.join(); // انتظر حتى ينتهي مؤشر الترابط thread1 قبل متابعة التنفيذ
System.out.println("انتهى الموضوع 1!");
System.out.println("isAlive: " + thread1.isAlive());
}
}
يرجى ملاحظة أن طريقة الانضمام مستخدمة في الكود أعلاه، وتتمثل الوظيفة الرئيسية لهذه الطريقة في ضمان استمرار تشغيل البرنامج بعد اكتمال طريقة تشغيل الخيط.
نتيجة تشغيل الكود أعلاه:
حي: كاذب
حي: صحيح
انتهى الموضوع 1!
حي: كاذب
2. تعليق وتنشيط المواضيع
بمجرد أن يبدأ الخيط في تنفيذ طريقة التشغيل، فلن يخرج حتى تكتمل طريقة التشغيل. ومع ذلك، أثناء تنفيذ مؤشر الترابط، يمكنك إيقاف تنفيذ مؤشر الترابط مؤقتًا من خلال طريقتين. هاتان الطريقتان هما التعليق والنوم. بعد استخدام التعليق المرحلي لتعليق سلسلة رسائل، يمكنك تنشيطها من خلال طريقة الاستئناف. بعد استخدام وضع السكون لجعل الخيط في وضع السكون، يمكن أن يكون الخيط في حالة الاستعداد فقط بعد الوقت المحدد (بعد انتهاء سكون الخيط، قد لا يتم تنفيذ الخيط على الفور، ولكنه يدخل فقط في حالة الاستعداد، في انتظار جدولة النظام) .
على الرغم من أن التعليق والاستئناف يمكن أن يعلقا وينشطا سلاسل الرسائل بسهولة، إلا أن استخدام هاتين الطريقتين قد يتسبب في حدوث بعض الأشياء غير المتوقعة، لذلك تم وضع علامة على هاتين الطريقتين على أنهما مهملان (احتجاج)، مما يشير إلى أنه قد يتم حذف هاتين الطريقتين في jdk المستقبلي. الإصدارات، لذا حاول عدم استخدام هاتين الطريقتين لتشغيل المواضيع. يوضح التعليمة البرمجية التالية استخدام أساليب السكون والتعليق والاستئناف.
انسخ رمز الكود كما يلي:
حزمة الفصل 2؛
الطبقة العامة MyThread تمتد الموضوع
{
فئة SleepThread تمتد الموضوع
{
تشغيل الفراغ العام ()
{
يحاول
{
نوم(2000);
}
قبض (الاستثناء ه)
{
}
}
}
تشغيل الفراغ العام ()
{
بينما (صحيح)
System.out.println(new java.util.Date().getTime());
}
يلقي الفراغ الرئيسي العام (String[] args) استثناءً
{
MyThread thread = new MyThread();
SleepThread SleepThread = thread.new SleepThread();
SleepThread.start(); // ابدأ في تشغيل مؤشر الترابط SleepThread
SleepThread.join(); // تأخير سكون الموضوع لمدة ثانيتين
Thread.start();
علامة منطقية = خطأ؛
بينما (صحيح)
{
Sleep(5000); // تأخير الخيط الرئيسي لمدة 5 ثوان
علم = !علم ؛
إذا (العلم)
Thread.suspend();
آخر
Thread.resume();
}
}
}
ظاهريًا، آثار استخدام النوم والتعليق متشابهة، لكن طريقة النوم لا تعادل التعليق. والفرق الأكبر بينهما هو أنه يمكنك تعليق مؤشر ترابط آخر في مؤشر ترابط واحد من خلال طريقة التعليق. على سبيل المثال، في الكود أعلاه، يتم تعليق مؤشر الترابط في الخيط الرئيسي. يعمل وضع السكون فقط على مؤشر الترابط الذي يتم تنفيذه حاليًا. في الكود أعلاه، ينام الخيط SleepThread والخيط الرئيسي لمدة ثانيتين و5 ثوانٍ على التوالي. عند استخدام وضع السكون، انتبه إلى أنه لا يمكنك وضع خيط واحد في خيط آخر. على سبيل المثال، استخدام طريقة thread.sleep(2000) في الطريقة الرئيسية لا يمكن أن يجعل مؤشر الترابط في وضع السكون لمدة ثانيتين، ولكن يمكن أن يجعل مؤشر الترابط الرئيسي في وضع السكون لمدة ثانيتين فقط.
هناك نقطتان يجب ملاحظتهما عند استخدام طريقة النوم:
1. تحتوي طريقة السكون على نموذجين مثقلين، لا يمكن لأحد النماذج المحملة بشكل زائد ضبط المللي ثانية فحسب، بل أيضًا النانو ثانية (1000000 نانو ثانية تساوي 1 مللي ثانية). ومع ذلك، فإن جهاز Java الظاهري على معظم أنظمة التشغيل الأساسية ليس دقيقًا بالنانو ثانية، لذلك، إذا تم تعيين النانو ثانية في وضع السكون، فسيأخذ جهاز Java الظاهري المللي ثانية الأقرب إلى هذه القيمة.
2. يجب استخدام الرميات أو المحاولة{...}التقاط{...} عند استخدام طريقة السكون. نظرًا لأن طريقة التشغيل لا يمكنها استخدام الرميات، يمكنك فقط استخدام المحاولة{...}catch{...}. عندما يكون الخيط في وضع السكون ويتم استخدام طريقة المقاطعة (ستتم مناقشة هذه الطريقة في 2.3.3) لمقاطعة الخيط، فإن وضع السكون سوف يرمي InterruptedException. يتم تعريف طريقة النوم على النحو التالي:
انسخ رمز الكود كما يلي:
سكون الفراغ الثابت العام (ملي طويل) يرمي InterruptedException
النوم الفارغ الثابت العام (ملي طويل، عدد صحيح من النانو) يلقي InterruptedException
3. ثلاث طرق لإنهاء الموضوع
هناك ثلاث طرق لإنهاء موضوع.
1. استخدم علامة الخروج لإخراج الخيط بشكل طبيعي، أي أن الخيط ينتهي عند اكتمال طريقة التشغيل.
2. استخدم طريقة الإيقاف لإنهاء مؤشر الترابط بالقوة (لا يُنصح بهذه الطريقة لأن الإيقاف، مثل التعليق والاستئناف، قد يؤدي أيضًا إلى نتائج غير متوقعة).
3. استخدم طريقة المقاطعة لمقاطعة الخيط.
1. قم بإنهاء الخيط باستخدام علامة الخروج
عند تنفيذ طريقة التشغيل، سيخرج الخيط. لكن في بعض الأحيان لا تنتهي طريقة التشغيل أبدًا. على سبيل المثال، تُستخدم سلاسل العمليات في برامج الخادم لمراقبة طلبات العميل، أو المهام الأخرى التي تتطلب معالجة دورية. في هذه الحالة، عادةً ما يتم وضع هذه المهام في حلقة، مثل حلقة while. إذا كنت تريد تشغيل الحلقة إلى الأبد، فيمكنك استخدام while(true){...} للتعامل معها. ولكن إذا كنت تريد إنهاء الحلقة أثناء الخروج في ظل ظروف معينة، فإن الطريقة الأكثر مباشرة هي تعيين علامة نوع منطقية، وتعيين هذه العلامة على صواب أو خطأ للتحكم في خروج الحلقة أثناء ذلك. يوجد أدناه مثال على إنهاء سلسلة رسائل باستخدام علامة الخروج.
انسخ رمز الكود كما يلي:
حزمة الفصل 2؛
الطبقة العامة ThreadFlag تمتد الموضوع
{
الخروج المنطقي العام المتقلب = خطأ؛
تشغيل الفراغ العام ()
{
بينما (! خروج)؛
}
يلقي الفراغ الرئيسي العام (String[] args) استثناءً
{
ThreadFlag thread = new ThreadFlag();
Thread.start();
Sleep(5000); // يتأخر الخيط الرئيسي لمدة 5 ثوانٍ
thread.exit = true; // إنهاء مؤشر الترابط
Thread.join();
System.out.println("تم خروج الموضوع!");
}
}
يتم تعريف علامة الخروج، خروج، في الكود أعلاه عندما يكون الخروج صحيحًا، يتم خروج الحلقة أثناء، وتكون القيمة الافتراضية للخروج خاطئة. عند تحديد الخروج، يتم استخدام كلمة Java الأساسية المتغيرة، والغرض من هذه الكلمة الأساسية هو مزامنة الخروج، مما يعني أن مؤشر ترابط واحد فقط يمكنه تعديل قيمة الخروج في نفس الوقت.
2. استخدم طريقة الإيقاف لإنهاء الخيط
استخدم طريقة الإيقاف لإنهاء مؤشر ترابط قيد التشغيل أو معلق بالقوة. يمكننا استخدام الكود التالي لإنهاء الموضوع:
Thread.stop();
على الرغم من أن استخدام الكود أعلاه يمكن أن ينهي الخيط، إلا أن استخدام طريقة الإيقاف أمر خطير للغاية، تمامًا مثل إيقاف تشغيل الكمبيوتر فجأة بدلاً من إيقاف التشغيل وفقًا للإجراء العادي، فقد يؤدي إلى نتائج غير متوقعة، لذلك لا ينصح باستخدامه طريقة التوقف.
3. استخدم طريقة المقاطعة لإنهاء مؤشر الترابط
يمكن تقسيم استخدام طريقة المقاطعة لإنهاء سلسلة رسائل إلى حالتين:
(1) الخيط في حالة محظورة، مثل استخدام طريقة السكون.
(2) استخدم while(!isInterrupted()){...} لتحديد ما إذا كان مؤشر الترابط قد تمت مقاطعته أم لا.
في الحالة الأولى باستخدام طريقة المقاطعة، ستطرح طريقة السكون استثناء InterruptedException، بينما في الحالة الثانية سيخرج مؤشر الترابط مباشرة. يوضح الكود أدناه استخدام طريقة المقاطعة في الحالة الأولى.
انسخ رمز الكود كما يلي:
حزمة الفصل 2؛
الطبقة العامة ThreadInterrupt تمتد الموضوع
{
تشغيل الفراغ العام ()
{
يحاول
{
النوم (50000)؛ // تأخير 50 ثانية
}
قبض على (InterruptedException ه)
{
System.out.println(e.getMessage());
}
}
يلقي الفراغ الرئيسي العام (String[] args) استثناءً
{
مؤشر الترابط = ThreadInterrupt الجديد () ؛
Thread.start();
System.out.println("اضغط على أي مفتاح خلال 50 ثانية لمقاطعة الخيط!");
System.in.read();
Thread.interrupt();
Thread.join();
System.out.println("لقد خرج الموضوع!");
}
}
نتائج تشغيل الكود أعلاه هي كما يلي:
انسخ رمز الكود كما يلي:
اضغط على أي مفتاح خلال 50 ثانية لمقاطعة الخيط!
توقف النوم
لقد خرج الموضوع!
بعد استدعاء أسلوب المقاطعة، يطرح أسلوب السكون استثناءً ثم يخرج رسالة الخطأ: تمت مقاطعة السكون.
ملاحظة: هناك طريقتان في فئة Thread لتحديد ما إذا كان سيتم إنهاء مؤشر الترابط من خلال طريقة المقاطعة. إحداهما هي الطريقة الثابتة التي تمت مقاطعتها () والأخرى هي الطريقة غير الثابتة هي الطريقة غير الثابتة (). الفرق بين هاتين الطريقتين هو أنه يتم استخدام المقاطعة لتحديد ما إذا كان مؤشر الترابط الحالي قد تمت مقاطعته، بينما يمكن استخدام isInterrupted لتحديد ما إذا كان. تمت مقاطعة المواضيع الأخرى. ولذلك، يمكن أيضًا استبدال while (!isInterrupted()) بـ while (!Thread.interrupted()).