1. الانضمام إلى الموضوع :
أثناء تنفيذ مؤشر الترابط، في بعض الأحيان تريد تنفيذ مؤشر ترابط آخر أولاً، مثل تقسيم مشكلة كبيرة إلى العديد من المشكلات الصغيرة، وتعيين سلاسل رسائل لكل مشكلة صغيرة، ولكن بعد معالجة جميع المشكلات الصغيرة، دع الخيط الرئيسي يقوم بإجراء المزيد من العمليات. في هذا الوقت، يمكننا استدعاء طريقة join () لسلاسل الرسائل الأخرى في سلسلة المحادثات الرئيسية لحظر سلسلة الرسائل المستدعية (هنا، سلسلة المحادثات الرئيسية).
رمز العينة:
انسخ رمز الكود كما يلي:
الحزمة org.frzh.thread;
الطبقة العامة JoinThread تمتد الموضوع {
// توفير مُنشئ ذو معلمات لتعيين اسم الموضوع
الانضمام العام إلى الموضوع (اسم السلسلة) {
سوبر (الاسم)؛
}
تشغيل الفراغ العام () {
لـ (int i = 0; i < 100; i++) {
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) {
// ابدأ موضوع الطفل
new JoinThread("موضوع جديد").start();
لـ (int i = 0; i < 100; i++) {
إذا (ط == 20) {
JoinThread jt = new JoinThread("الموضوع المراد ضمه");
jt.start();
// يستدعي الخيط الرئيسي طريقة الانضمام لخيط jt، ثم يجب أن ينتظر الخيط الرئيسي حتى ينتهي jt من التنفيذ قبل أن يتمكن من التنفيذ
يحاول {
jt.join();
} قبض على (InterruptedException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " " +i);
}
}
}
في الأصل كانت هناك ثلاث مجموعات من سلاسل الرسائل (خيطان فرعيان وخيط رئيسي واحد عندما يكون i = 20، يتم حظر الخيط الرئيسي ويجب عليه الانتظار حتى يتم تنفيذ "الخيط المنضم" قبل أن تتاح له فرصة التنفيذ، لذلك هناك يتم تنفيذ موضوعين فقط بعد ذلك.
ثلاثة أشكال مثقلة من طريقة join ():
join (): انتظر حتى ينتهي تنفيذ الخيط المنضم ؛
الانضمام (ملي طويل): أطول وقت لانتظار تنفيذ الخيط المرتبط هو ميلي ثانية. بعد ذلك، حتى لو لم ينته تنفيذ الخيط المرتبط، فلن ينتظر لفترة أطول.
join(long millis, int nanos): الحد الأقصى لوقت الانتظار حتى يتم تنفيذ الخيط المنضم هو ميلي ميلي ثانية + نانو ميكروثانية. (هذه الطريقة غير مجدية في الأساس).
2:خلفية الموضوع :
يوجد خيط يعمل في الخلفية، ومهمته هي خدمة سلاسل رسائل أخرى. يُسمى هذا الخيط "خيط الخلفية" أو "خيط الخفي" أو "خيط العفريت". عندما تموت جميع الخيوط الأمامية، سيموت خيط الخلفية تلقائيًا.
رمز العينة:
انسخ رمز الكود كما يلي:
الحزمة org.frzh.thread;
الطبقة العامة DaemonThread تمتد الموضوع {
تشغيل الفراغ العام () {
لـ (int i = 0; i < 1000; i++) {
System.out.println(getName() + " " +i);
}
}
public static void main(String[] args) {
DaemonThread dt = new DaemonThread();
// قم بتعيين هذا الموضوع كموضوع خلفية
dt.setDaemon(true);
dt.start();
لـ (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
// ينتهي الخيط الأمامي، ثم سينتهي الخيط الخلفي dt أيضًا، لذلك لن يتم تنفيذه 999
}
}
يتم تعيين مؤشر الترابط الرئيسي بشكل افتراضي على مؤشر الترابط الأمامي، والخيوط الفرعية التي تم إنشاؤها بواسطة مؤشر ترابط المقدمة بشكل افتراضي إلى مؤشر ترابط المقدمة، والخيوط الفرعية التي تم إنشاؤها بواسطة مؤشر ترابط الخلفية بشكل افتراضي إلى مؤشر ترابط الخلفية.
3. خيط النوم (النوم):
طريقة الانضمام السابقة هي السماح لمؤشر الترابط المتصل بالانتظار حتى ينتهي تنفيذ الخيط المنضم قبل المتابعة، بينما تتمثل طريقة السكون () في السماح لمؤشر الترابط المتصل بالحظر لفترة من الوقت قبل إعادة الدخول إلى حالة الاستعداد وانتظار الانتهاء المقرر. ولذلك غالبا ما يستخدم لإيقاف تنفيذ البرنامج مؤقتا.
رمز العينة:
انسخ رمز الكود كما يلي:
الحزمة org.frzh.thread;
import java.util.Date;
فئة النوم العامة {
public static void main(String[] args) {
لـ (int i = 0; i < 10; i++) {
System.out.println("الوقت الحالي:" + تاريخ جديد());
يحاول {
Thread.sleep(1000);
} قبض على (InterruptedException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
}
}
طريقتان للتحميل الزائد لطريقة النوم ():
السكون الفارغ الثابت (مللي طويل): دع الخيط الحالي يتوقف مؤقتًا لمدة ملي ميلي ثانية ويدخل في حالة الحظر. تتأثر هذه الطريقة بدقة ودقة مؤقتات النظام وبرامج جدولة السلاسل.
السكون الفارغ الثابت (ملي طويل، int nanos): إيقاف المللي ثانية مؤقتًا + النانو ميكروثانية وإدخال حالة الحظر، كما سيتأثر بدقة ودقة مؤقت النظام وجدولة الخيط. ليست هناك حاجة في الأساس.
4. العائد الموضوع :
تشبه طريقة العائد () إلى حد ما طريقة السكون، ويمكنها أيضًا إيقاف الخيط قيد التشغيل مؤقتًا، لكنها لن تمنع الخيط، ولكنها تنقله فقط إلى حالة الاستعداد (لاحظ أنها ليست حالة حظر). لن تمنح طريقة العائد () سوى فرصة للتنفيذ للسلاسل التي لها نفس الأولوية أو الأولوية الأعلى، لذلك قد تتم إعادة جدولة الخيط مرة أخرى لمواصلة التنفيذ بعد استدعاء هذه الطريقة.
رمز العينة:
انسخ رمز الكود كما يلي:
الحزمة org.frzh.thread;
الطبقة العامة YieldThread تمتد الموضوع {
موضوع العائد العام () {
}
موضوع العائد العام (اسم السلسلة) {
سوبر (الاسم)؛
}
تشغيل الفراغ العام () {
لـ (int i = 0; i < 100; i++) {
System.out.println(getName() + " " +i);
إذا (ط == 20) {
// ينتج عن الخيط الحالي
Thread.yield();
}
}
}
public static void main(String[] args) {
// ابدأ موضوعين متزامنين
YieldThread yt1 = new YieldThread("Advanced");
// قم بتعيين yt1 كأولوية قصوى
yt1.setPriority(Thread.MAX_PRIORITY);
yt1.start();
YieldThread yt2 = new YieldThread("low-level");
yt2.setPriority(Thread.MIN_PRIORITY);
yt2.start();
/*
* إذا لم يتم تعيين الأولوية للخيط، فإن أولوية الخيطين هي نفسها، لذلك سيتم تنفيذ الخيطين بالتناوب، وعندما يتم استدعاء العائد، سيتم تنفيذ الخيط الآخر؛
* ومع ذلك، بعد تحديد الأولويات المذكورة أعلاه للخيطين على التوالي، بدأ تنفيذ الخيط المتقدم للتو عندما يكون i = 20، يتم استدعاء العائد، ولكن لأن طريقة العائد ستفعل ذلك فقط
* إعطاء فرص التنفيذ للسلاسل التي لها نفس الأولوية أو أولوية أعلى، بحيث لا يزال الخيط عالي المستوى قيد التنفيذ في هذا الوقت ولن يتم منحه للخيوط ذات المستوى المنخفض
*/
}
}
5: تغيير أولوية الموضوع :
هذا بسيط نسبيًا، ما عليك سوى استدعاء طريقة المثيل setPriority(int Priority). يتم تعيين كل مؤشر ترابط افتراضيًا على نفس الأولوية مثل مؤشر الترابط الأصلي الخاص به، ويكون مؤشر الترابط الرئيسي افتراضيًا على الأولوية العادية (5). توفر Java الأولويات من 1 إلى 10، ويمكنك أيضًا استخدام ثلاثة ثوابت ثابتة:
MAX_PRIORITY:10
الحد الأدنى_الأولوية:1
NORM_PRIORITY:5
ملاحظة: على الرغم من أن Java توفر 10 أولويات، إلا أن الأنظمة المختلفة تدعم أولويات مختلفة، لذا حاول تجنب الاستخدام المباشر للأرقام بين 1 و10، واستخدم الثوابت الثابتة لضمان سهولة النقل.