في برمجة Java متعددة الخيوط، يحتوي النوع java.lang.Thread على سلسلة من الأساليب start() وstop() وstop(Throwable) وSupport() وdestroy() وsume(). من خلال هذه الطرق، يمكننا إجراء عمليات مناسبة على سلاسل الرسائل، ولكن من بين هذه الطرق، يتم الاحتفاظ فقط بطريقة start ().
تم شرح أسباب التخلي عن هذه الأساليب بالتفصيل في مقال بقلم Sun "لماذا تم إهمال Thread.stop وThread.suspend وThread.resume؟"
إذا كنت تريد حقًا إنهاء سلسلة رسائل، فيمكنك استخدام الطرق التالية:
1. دع طريقة تشغيل الخيط () تنتهي من التنفيذ وينتهي الخيط بشكل طبيعي. (هذه الطريقة هي الأفضل)
2. قم بإنهاء الموضوع عن طريق الاقتراع ومشاركة بتات العلامة، مثل while(flag){}، يتم تعيين القيمة الأولية للعلامة على true، وعندما يلزم إنهاؤها، قم بتعيين قيمة العلامة على false. (هذه الطريقة ليست جيدة أيضًا، لأنه إذا تم حظر الطريقة while(flag){}، فستصبح العلامة غير صالحة)
توقف منطقي متقلب خاص = خطأ؛
إنهاء الفراغ العام () {
توقف = صحيح؛
}
تشغيل الفراغ العام () {
بينما (توقف) {
// ... بعض العبارات
}
}
}
إذا دخل الخيط إلى الحالة غير القابلة للتشغيل بسبب تنفيذ السكون () أو الانتظار ()، وإذا كان الانتظار ()، فلن يعمل إذا تم استخدام بت العلامة.
انتظار الفراغ النهائي العام (مهلة طويلة)
throws InterruptedException تؤدي هذه الطريقة إلى وضع مؤشر الترابط الحالي (نسميه T) في مجموعة انتظار الكائن ثم التخلي عن كافة متطلبات المزامنة على هذا الكائن. أي أن الخيط الحالي يصبح في حالة انتظار
الاستخدام القياسي للانتظار ()
متزامن (الكائن) {
بينما(<لم يتم استيفاء الشرط>){
obj.wait();
}
عملية المعالجة التي تلبي الشروط
}
وتريد إيقافه، يمكنك استخدام الخيار الثالث، أي.
3. استخدم المقاطعة () وسيقوم البرنامج بطرح استثناء InterruptedException، مما يتسبب في ترك مؤشر ترابط التنفيذ طريقة التشغيل ().
على سبيل المثال:
الطبقة العامة SomeThread {
الفراغ العام الثابت الرئيسي (String[] args)
{
موضوع الموضوع = موضوع جديد (جديد قابل للتشغيل () {
تشغيل الفراغ العام () {
بينما (!Thread.interrupt()) {
// معالجة العمل المراد معالجته
يحاول {
System.out.println("اذهب للنوم");
Thread.sleep(1000);
} قبض على (InterruptedException e) {
printStackTrace();
System.out.println("لقد تمت مقاطعتي!");
}
});
Thread.start();
Thread.interrupt();
}
}
اذهب إلى النوم
لقد تمت مقاطعتي!