في بعض الأحيان، نحتاج إلى مقاطعة تنفيذ الخيط في وقت محدد. على سبيل المثال، الخيط الذي يتحقق من حالة المستشعر مرة واحدة كل دقيقة، وفي بقية الوقت، لا يحتاج الخيط إلى القيام بأي شيء. خلال هذا الوقت، لا يحتاج الخيط إلى استخدام أي من موارد الكمبيوتر. بعد مرور هذه الفترة الزمنية، وعندما يقوم جهاز Java الظاهري بجدولة الخيط، يستمر تنفيذ الخيط. للقيام بذلك، يمكنك استخدام طريقة السكون () لفئة الموضوع. تؤخر هذه الطريقة تنفيذ مؤشر الترابط أثناء وضع السكون، وتحدد معلمة النوع الصحيح عدد المللي ثانية اللازمة لوضع السكون. عندما يتم استدعاء طريقة السكون () وانتهاء وقت السكون، يقوم جهاز Java الظاهري بتخصيص وقت تشغيل وحدة المعالجة المركزية لمؤشر الترابط، وسيستمر تنفيذ الخيط.
هناك طريقة أخرى لاستخدام طريقة السكون () وهي من خلال عناصر نوع التعداد TimeUnit. تستخدم هذه الطريقة طريقة السكون () الخاصة بمؤشر الترابط لجعل الخيط الحالي في وضع السكون، ويمكنه قبول وحدة الوقت المحددة كمعلمة وتحويلها إلى العدد المقابل من المللي ثانية.
في هذا القسم، سنقوم بتطوير برنامج يستخدم طريقة السكون () لطباعة الوقت الحالي في كل ثانية.
تعرف عليه
اتبع الخطوات الموضحة أدناه لتنفيذ الأمثلة الواردة في هذا القسم.
1. قم بإنشاء فئة باسم FileClock وقم بتنفيذ الواجهة القابلة للتشغيل. الرمز هو كما يلي:
انسخ رمز الكود كما يلي:
الطبقة العامة FileClock تنفذ Runnable {
2. قم بتنفيذ طريقة التشغيل (). الرمز هو كما يلي:
انسخ رمز الكود كما يلي:
@تجاوز
تشغيل الفراغ العام () {
3. اكتب حلقة تجتاز عشر مرات، في كل تكرار، قم بإنشاء كائن التاريخ وطباعته على وحدة التحكم. ثم قم باستدعاء طريقة السكون () من خلال خاصية SECONDS الخاصة بـ TimeUtil لتأخير تنفيذ مؤشر الترابط لمدة ثانية واحدة. اعتقدت أن طريقة السكون () ستطرح InterruptedException. ولذلك، نحن بحاجة إلى كتابة بضعة أسطر إضافية من التعليمات البرمجية للقبض على الاستثناءات. عند احتمال مقاطعة سلسلة رسائل، فمن الأفضل دائمًا تحرير الموارد المستخدمة في سلسلة المحادثات أو إغلاقها. الرمز هو كما يلي:
انسخ رمز الكود كما يلي:
لـ (int i = 0; i < 10; i++) {
System.out.printf("%s/n"، تاريخ جديد ())؛
يحاول {
TimeUnit.SECONDS.sleep(1);
} قبض على (InterruptedException e) {
System.out.printf("تمت مقاطعة FileClock./n");
}
}
4. لدينا بالفعل فئة خيط تم تنفيذها بشكل جيد. الآن دعونا نطبق الطبقة الرئيسية. قم بإنشاء فئة باسم FileMain وقم بتنفيذ الطريقة الرئيسية (). الرمز هو كما يلي:
انسخ رمز الكود كما يلي:
فئة عامة FileMain {
public static void main(String[] args) {
5. قم بإنشاء كائن FileClock، ثم قم بإنشاء مؤشر ترابط لتنفيذ المهام. ثم، ابدأ الخيط. الرمز هو كما يلي:
انسخ رمز الكود كما يلي:
ساعة FileClock = FileClock () جديد؛
موضوع الموضوع = موضوع جديد (ساعة)؛
Thread.start();
6. في الموضوع الرئيسي، قم باستدعاء طريقة السكون () من خلال خاصية SECONDS الخاصة بـ TimeUtil للانتظار لمدة خمس ثوانٍ. الرمز هو كما يلي:
انسخ رمز الكود كما يلي:
يحاول {
TimeUnit.SECONDS.sleep(5);
} قبض على (InterruptedException e) {
printStackTrace();
}
7. قم بمقاطعة مؤشر ترابط FileClock. الرمز هو كما يلي:
انسخ رمز الكود كما يلي:
Thread.interrupt();
8. قم بتنفيذ المثال وتحقق من تأثير التنفيذ.
أعرف لماذا
عند تنفيذ هذا البرنامج، ستجد كيف يقوم البرنامج بطباعة كائن التاريخ في كل ثانية وكيف يتم مقاطعة الخيط.
عند استدعاء طريقة السكون () سيترك الخيط وحدة المعالجة المركزية ويتوقف عن التنفيذ لفترة من الوقت. خلال هذا الوقت، لم يعد الخيط بحاجة إلى وحدة المعالجة المركزية، لذلك يمكن لوحدة المعالجة المركزية أداء مهام أخرى.
عند مقاطعة مؤشر ترابط نائم، سيتم طرح InterruptedException على الفور بدلاً من الانتظار حتى انتهاء وضع السكون.
لا تنتهي أبدا
في واجهة برمجة التطبيقات المتزامنة لـ Java، هناك طريقة أخرى للسماح للسلاسل بالتخلي عن وحدة المعالجة المركزية. هذه هي طريقة العائد (). يؤدي استدعاء هذه الطريقة إلى إرسال رسالة إلى جهاز Java الظاهري تشير إلى أن الخيط يمكنه التخلي عن وحدة المعالجة المركزية لسلاسل رسائل أخرى. لا يضمن جهاز Java الظاهري الاستجابة لهذا الطلب. عادةً، يتم استخدام هذه الطريقة فقط عند تصحيح أخطاء البرنامج.
استخدام العقيدة
تمت ترجمة هذه المقالة من "Java 7 Concurrency Cookbook" (سرقها D Gua Ge باسم "مجموعة أمثلة Java7 Concurrency") ويتم استخدامها فقط كمواد تعليمية. ولا يجوز استخدامه لأية أغراض تجارية دون تصريح.
نجاح صغير
النسخة الكاملة من نموذج التعليمات البرمجية المستخدم في هذا القسم.
الكود الكامل لفئة FileClock هو كما يلي:
الحزمة com.diguage.books.concurrencycookbook.chapter1.recipe5؛
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
* اطبع التاريخ والوقت الحاليين على وحدة التحكم كل ثانية.
* التاريخ: 2013-09-18
*الزمن: 23:11
*/
الطبقة العامة FileClock تنفذ Runnable {
@تجاوز
تشغيل الفراغ العام () {
لـ (int i = 0; i < 10; i++) {
System.out.printf("%s/n"، تاريخ جديد ())؛
يحاول {
TimeUnit.SECONDS.sleep(1);
} قبض على (InterruptedException e) {
System.out.printf("تمت مقاطعة FileClock./n");
}
}
}
رمز كامل لفئة FileMain
انسخ رمز الكود كما يلي:
الحزمة com.diguage.books.concurrencycookbook.chapter1.recipe5؛
import java.util.concurrent.TimeUnit;
/**
* موضوع النوم التجريبي واستئنافه
* التاريخ: 2013-09-19
*التوقيت: 00:29
*/
فئة عامة FileMain {
public static void main(String[] args) {
ساعة FileClock = FileClock () جديد؛
موضوع الموضوع = موضوع جديد (ساعة)؛
Thread.start();
يحاول {
TimeUnit.SECONDS.sleep(5);
} قبض على (InterruptedException e) {
printStackTrace();
}
Thread.interrupt();
}
}