1. قم بإنشاء موضوع
هناك طريقتان لإنشاء سلاسل رسائل في Java: استخدام فئة Thread واستخدام الواجهة القابلة للتشغيل. عند استخدام واجهة Runnable، تحتاج إلى إنشاء مثيل Thread. لذلك، سواء قمت بإنشاء مؤشر ترابط من خلال فئة Thread أو الواجهة القابلة للتشغيل، يجب عليك إنشاء مثيل لفئة Thread أو فئتها الفرعية. منشئ الموضوع:
الطريقة الأولى: وراثة فئة الموضوع وتجاوز طريقة التشغيل
}
}
العرض التوضيحي للفئة يمتد الموضوع {
تشغيل الفراغ العام () {
ل(int i=0;i<60;i++){
System.out.println(Thread.currentThread().getName()+i);
}
}
}
تمامًا كما يولد الناس، ويكبرون، ويمرضون، ويموتون، يجب أن تمر الخيوط أيضًا بأربع حالات مختلفة: البدء (الانتظار)، والجري، والتعليق، والتوقف. يمكن التحكم في هذه الحالات الأربع من خلال الأساليب الموجودة في فئة Thread. الطرق المتعلقة بهذه الحالات الأربع في فئة Thread موضحة أدناه.
لا ينفذ الخيط التعليمات البرمجية في طريقة التشغيل مباشرة بعد إنشائها، ولكنه في حالة انتظار. عندما يكون الخيط في حالة الانتظار، يمكنك تعيين سمات مختلفة للخيط من خلال أساليب فئة الخيط، مثل أولوية الخيط (setPriority)، واسم الخيط (setName)، ونوع الخيط (setDaemon).
عندما يتم استدعاء طريقة البدء، يبدأ الخيط في تنفيذ التعليمات البرمجية في طريقة التشغيل. يدخل الخيط في حالة التشغيل. يمكنك استخدام أسلوب isAlive لفئة Thread لتحديد ما إذا كان مؤشر الترابط قيد التشغيل. عندما يكون الخيط في حالة التشغيل، يُرجع isAlive صحيحًا. عندما يُرجع isAlive خطأ، قد يكون الخيط في حالة الانتظار أو في حالة التوقف. يوضح التعليمة البرمجية التالية التبديل بين الحالات الثلاث لإنشاء مؤشر الترابط، والتشغيل والإيقاف، وإخراج قيمة الإرجاع المقابلة isAlive.
بمجرد أن يبدأ الخيط في تنفيذ طريقة التشغيل، فلن يخرج حتى تكتمل طريقة التشغيل. ومع ذلك، أثناء تنفيذ مؤشر الترابط، هناك طريقتان يمكن استخدامهما لإيقاف تنفيذ مؤشر الترابط مؤقتًا. هاتان الطريقتان هما التعليق والنوم. بعد استخدام التعليق المرحلي لتعليق سلسلة رسائل، يمكنك تنشيطها من خلال طريقة الاستئناف. بعد استخدام وضع السكون لجعل الخيط في وضع السكون، يمكن أن يكون الخيط في حالة الاستعداد فقط بعد الوقت المحدد (بعد انتهاء سكون الخيط، قد لا يتم تنفيذ الخيط على الفور، ولكنه يدخل فقط في حالة الاستعداد، في انتظار جدولة النظام) .
هناك نقطتان يجب ملاحظتهما عند استخدام طريقة النوم:
1. تحتوي طريقة السكون على نموذجين مثقلين، لا يمكن لأحد النماذج المحملة بشكل زائد ضبط المللي ثانية فحسب، بل أيضًا النانو ثانية (1000000 نانو ثانية تساوي 1 مللي ثانية). ومع ذلك، فإن جهاز Java الظاهري على معظم أنظمة التشغيل الأساسية ليس دقيقًا بالنانو ثانية، لذلك، إذا تم تعيين النانو ثانية في وضع السكون، فسيأخذ جهاز Java الظاهري المللي ثانية الأقرب إلى هذه القيمة.
2. يجب استخدام الرميات أو المحاولة{...}التقاط{...} عند استخدام طريقة السكون. نظرًا لأن طريقة التشغيل لا يمكنها استخدام الرميات، يمكنك فقط استخدام المحاولة{...}catch{...}. عندما يكون مؤشر الترابط في وضع السكون ويتم استخدام أسلوب المقاطعة لمقاطعة مؤشر الترابط، فسيقوم وضع السكون بطرح استثناء InterruptedException. يتم تعريف طريقة النوم على النحو التالي:
هناك ثلاث طرق لإنهاء موضوع.
1. استخدم علامة الخروج لجعل الخيط يخرج بشكل طبيعي، أي أن الخيط ينتهي عند اكتمال طريقة التشغيل.
2. استخدم طريقة الإيقاف لإنهاء مؤشر الترابط بالقوة (لا يُنصح بهذه الطريقة لأن الإيقاف، مثل التعليق والاستئناف، قد يؤدي أيضًا إلى نتائج غير متوقعة).
3. استخدم طريقة المقاطعة لمقاطعة الخيط.
1. قم بإنهاء الخيط باستخدام علامة الخروج
عند تنفيذ طريقة التشغيل، سيخرج الخيط. لكن في بعض الأحيان لا تنتهي طريقة التشغيل أبدًا. على سبيل المثال، تُستخدم سلاسل العمليات في برامج الخادم لمراقبة طلبات العميل، أو المهام الأخرى التي تتطلب معالجة دورية. في هذه الحالة، عادةً ما يتم وضع هذه المهام في حلقة، مثل حلقة while. إذا كنت تريد تشغيل الحلقة إلى الأبد، فيمكنك استخدام while(true){...} للتعامل معها. ولكن إذا كنت تريد الخروج من الحلقة أثناء شرط معين، فإن الطريقة الأكثر مباشرة هي تعيين علامة نوع منطقية، وتعيين هذه العلامة على صواب أو خطأ للتحكم في خروج الحلقة أثناء ذلك. يوجد أدناه مثال على إنهاء سلسلة رسائل باستخدام علامة الخروج.
تتمثل وظيفة طريقة الانضمام في جعل سلاسل التنفيذ غير المتزامنة تصبح تنفيذًا متزامنًا. وهذا يعني أنه عند استدعاء طريقة البدء لمثيل مؤشر الترابط، ستعود هذه الطريقة على الفور. إذا كنت بحاجة إلى استخدام قيمة محسوبة بواسطة هذا الخيط بعد استدعاء طريقة البدء، فيجب عليك استخدام طريقة الانضمام. إذا لم تستخدم طريقة الانضمام، فليس هناك ضمان أنه عند تنفيذ عبارة تتبع طريقة البدء، سيتم تنفيذ مؤشر الترابط. بعد استخدام طريقة الانضمام، لن يستمر البرنامج في التنفيذ حتى يخرج هذا الموضوع. يوضح التعليمة البرمجية التالية استخدام الانضمام.
3. قضايا أمنية متعددة الخيوط
سبب المشكلة: عندما تعمل عبارات متعددة على نفس مؤشر الترابط وتشارك البيانات، ينفذ مؤشر ترابط واحد فقط جزءًا من العبارات المتعددة قبل اكتمال التنفيذ، ويشارك مؤشر ترابط آخر في التنفيذ، مما يؤدي إلى حدوث أخطاء في البيانات المشتركة.
الحل: بالنسبة إلى العبارات المتعددة التي تعمل على البيانات المشتركة، يمكن تنفيذ مؤشر ترابط واحد فقط أثناء عملية التنفيذ، ولن يتم تنفيذ مؤشرات الترابط الأخرى.
كتلة التعليمات البرمجية المتزامنة:
}
}
}
}
تشغيل الفراغ العام () {
بينما (صحيح) {
SaleTicket();
}
}
}
التواصل بين الخيوط
س=(س+1)%2;
}
}
}).يبدأ()؛
موضوع جديد (جديد قابل للتشغيل () {
تشغيل الفراغ العام () {
بينما (صحيح) {
p.get();
}
}
}).يبدأ()؛
}
}
/*
تشانغ سان .... ذكر تشانغ سان .... ذكر
ليلى....ن.ف
ليلى .... ذكر تشانغ سان .... nv
ليلى....ذكر
*/
}
}
}).يبدأ()؛
موضوع جديد (جديد قابل للتشغيل () {
تشغيل الفراغ العام () {
بينما (صحيح) {
متزامن (ع) {
p.get();
}
}
}
}).يبدأ()؛
}
}
/*
ليلى....ن.ف
ليلى....ن.ف
ليلى....ن.ف
ليلى....ن.ف
ليلى....ن.ف
ليلى....ن.ف
تشانغ سان....ذكر تشانغ سان....ذكر تشانغ سان....ذكر تشانغ سان....ذكر
*/
}
}
}).يبدأ()؛
موضوع جديد (جديد قابل للتشغيل () {
تشغيل الفراغ العام () {
بينما (صحيح) {
متزامن (ع) {
إذا (! الأعلام)
يحاول {
انتظر () ؛
} قبض على (InterruptedException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
};
p.get();
أعلام =خطأ؛
p.notifyAll();
}
}
}
}).يبدأ()؛
}
}
}
البضائع النهائية g = البضائع الجديدة () ؛
موضوع جديد (جديد قابل للتشغيل () {
تشغيل الفراغ العام () {
بينما (صحيح) {
g.produce("السلع");
}
}
}).يبدأ()؛
موضوع جديد (جديد قابل للتشغيل () {
تشغيل الفراغ العام () {
بينما (صحيح) {
g.consume();
}
}
}).يبدأ()؛
}
}
}
البضائع النهائية g = البضائع الجديدة () ؛
موضوع جديد (جديد قابل للتشغيل () {
تشغيل الفراغ العام () {
بينما (صحيح) {
g.produce("السلع");
}
}
}"المنتج رقم 1").start();
موضوع جديد (جديد قابل للتشغيل () {
تشغيل الفراغ العام () {
بينما (صحيح) {
g.produce("السلع");
}
}
}"المنتج رقم 2").start();
موضوع جديد (جديد قابل للتشغيل () {
تشغيل الفراغ العام () {
بينما (صحيح) {
g.consume();
}
}
}"المستهلك رقم 1").start();
موضوع جديد (جديد قابل للتشغيل () {
تشغيل الفراغ العام () {
بينما (صحيح) {
g.consume();
}
}
}"المستهلك رقم 2").start();
}
}
/*
المستهلك رقم 2 مستهلك ****** رقم المنتج : 48049
أنتج المنتج الأول.... رقم الصنف: 48050
المستهلك رقم 1 مستهلك ****** رقم المنتج : 48050
أنتج المنتج الأول.... رقم الصنف: 48051
المستهلك رقم 2 مستهلك ****** رقم المنتج : 48051
تم إنتاج المنتج رقم 2.... رقم الصنف: 48052
المستهلك رقم 2 مستهلك ****** رقم المنتج : 48052
أنتج المنتج الأول.... رقم الصنف: 48053
المستهلك رقم 1 مستهلك ****** رقم المنتج : 48053
أنتج المنتج الأول.... رقم الصنف: 48054
المستهلك رقم 2 مستهلك ****** رقم المنتج : 48054
تم إنتاج المنتج رقم 2.... رقم الصنف: 48055
المستهلك رقم 2 مستهلك ****** رقم المنتج : 48055
*/