تعتبر أساليب الانتظار والإخطار والإخطار جميع الطرق الأصلية النهائية لفئة الكائن. لذلك، لا يمكن تجاوز هذه الأساليب بواسطة الفئات الفرعية، فئة الكائن هي الفئة العليا لجميع الفئات، لذلك هناك الأشكال الثلاثة التالية لاستدعاء الانتظار والطرق الأخرى في البرنامج.
انسخ رمز الكود كما يلي:
انتظر ()؛ // الطريقة الأولى:
this.wait();// الطريقة الثانية:
super.wait();// الطريقة الثالثة
إعلام باطلة ()
يقوم بإلغاء حظر كافة مؤشرات الترابط التي تستدعي طريقة الانتظار على هذا الكائن. لا يمكن استدعاء هذه الطريقة إلا داخل طريقة متزامنة أو كتلة متزامنة. إذا لم يكن الخيط الحالي هو حامل القفل، فستطرح هذه الطريقة استثناء IllegalMonitorStateException.
إعلام باطلة ()
حدد بشكل عشوائي مؤشر ترابط يستدعي طريقة الانتظار على الكائن لإلغاء حظره. لا يمكن استدعاء هذه الطريقة إلا داخل طريقة متزامنة أو كتلة متزامنة. إذا لم يكن الخيط الحالي هو حامل القفل، فستطرح هذه الطريقة استثناء IllegalMonitorStateException.
انتظار باطل ()
يتسبب في دخول مؤشر الترابط في حالة انتظار حتى يتم إيقاظه بواسطة سلاسل رسائل أخرى من خلال notify () أو notifyAll. لا يمكن استدعاء هذه الطريقة إلا ضمن طريقة متزامنة. إذا لم يكن الخيط الحالي هو حامل القفل، فستطرح هذه الطريقة استثناء IllegalMonitorStateException.
الانتظار الفارغ (ملي طويل) والانتظار الفارغ (ملي طويل، نانو int)
يؤدي إلى دخول مؤشر الترابط في حالة انتظار حتى يتم إعلامه أو انقضاء الوقت المحدد. لا يمكن استدعاء هذه الأساليب إلا ضمن الأساليب المتزامنة. إذا لم يكن الخيط الحالي هو حامل القفل، فستطرح هذه الطريقة استثناء IllegalMonitorStateException.
يجب كتابة Object.wait() وObject.notify() وObject.notifyall() داخل الطريقة المتزامنة أو داخل الكتلة المتزامنة وذلك لأن هذه الأساليب تتطلب أن يمتلك الخيط الذي يشغل حاليًا الأسلوب object.wait() قفل الكائن. حتى لو كنت تعرف على وجه اليقين أن مؤشر ترابط السياق الحالي يمتلك قفل الكائن، فلا يمكنك كتابة عبارات مثل object.wait() في السياق الحالي. يحب:
انسخ رمز الكود كما يلي:
الحزمة edu.sjtu.erplab.ObjectTest؛
فئة أ
{
printThreadInfo () الفارغة المتزامنة العامة تطرح InterruptedException
{
الموضوع t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}
الطبقة العامة ObjectWaitTest {
الفراغ العام الثابت الرئيسي (سلسلة الحجج [])
{
أ أ=جديد أ();
// نظرًا لأن طريقة printThreadInfo () تطرح InterruptedException، فيجب استخدام كتلة محاولة الالتقاط هنا.
يحاول {
a.printThreadInfo();
انتظر ()؛
} قبض على (InterruptedException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
}
سيتم الإبلاغ عن خطأ عند تشغيل البرنامج، وتكون النتائج كما يلي:
معرف الموضوع: 1، اسم الموضوع: الرئيسي
استثناء في مؤشر الترابط "الرئيسي" java.lang.IllegalMonitorStateException
في java.lang.Object.wait (الطريقة الأصلية)
في java.lang.Object.wait(Object.java:485)
في edu.sjtu.erplab.ObjectTest.ObjectWaitTest.main(ObjectWaitTest.java:24)
وينبغي أن تكون الطريقة الصحيحة لكتابتها
انسخ رمز الكود كما يلي:
الحزمة edu.sjtu.erplab.ObjectTest؛
فئة أ
{
printThreadInfo () الفارغة المتزامنة العامة تطرح InterruptedException
{
الموضوع t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
// this.wait(); //استمر في الانتظار
this.wait(1000);// انتظر 1000 مللي ثانية
// super.wait(1000);
}
}
الطبقة العامة ObjectWaitTest {
الفراغ العام الثابت الرئيسي (سلسلة الحجج [])
{
أ أ=جديد أ();
// نظرًا لأن طريقة printThreadInfo () تطرح InterruptedException، فيجب استخدام كتلة محاولة الالتقاط هنا.
يحاول {
a.printThreadInfo();
//a.wait();
} قبض على (InterruptedException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
الموضوع t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}