Metode wait, notify dan notifyAll adalah metode asli terakhir dari kelas Object. Oleh karena itu, metode ini tidak dapat ditimpa oleh subkelas. Kelas Object adalah superkelas dari semua kelas, jadi ada tiga bentuk pemanggilan wait dan metode lain berikut dalam program.
Copy kode kodenya sebagai berikut:
tunggu();//Metode 1:
ini.tunggu();//Metode 2:
super.tunggu();//Metode 3
batal beri tahuSemua()
Membuka blokir semua thread yang memanggil metode wait pada objek ini. Metode ini hanya dapat dipanggil di dalam metode tersinkronisasi atau blok tersinkronisasi. Jika thread saat ini bukan pemegang kunci, metode ini akan memunculkan IllegalMonitorStateException.
batal beri tahu()
Pilih secara acak thread yang memanggil metode wait pada objek untuk membuka blokirnya. Metode ini hanya dapat dipanggil di dalam metode tersinkronisasi atau blok tersinkronisasi. Jika thread saat ini bukan pemegang kunci, metode ini akan memunculkan IllegalMonitorStateException.
batal tunggu()
Menyebabkan thread memasuki status menunggu hingga dibangunkan oleh thread lain melalui notify() atau notifyAll. Metode ini hanya dapat dipanggil dalam metode tersinkronisasi. Jika thread saat ini bukan pemegang kunci, metode ini akan memunculkan IllegalMonitorStateException.
batal menunggu(milis panjang) dan batal menunggu(milis panjang,int nanos)
Menyebabkan thread memasuki status menunggu hingga diberitahukan atau waktu yang ditentukan berlalu. Metode ini hanya dapat dipanggil dalam metode tersinkronisasi. Jika thread saat ini bukan pemegang kunci, metode ini akan memunculkan IllegalMonitorStateException.
Object.wait(), Object.notify() dan Object.notifyall() harus ditulis di dalam metode tersinkronisasi atau di dalam blok tersinkronisasi. Hal ini karena metode ini mengharuskan thread yang saat ini menjalankan metode objek.tunggu() memiliki objek.kunci objek. Bahkan jika Anda mengetahui dengan pasti bahwa thread konteks saat ini memiliki kunci objek, Anda tidak dapat menulis pernyataan seperti object.wait() dalam konteks saat ini. menyukai:
Copy kode kodenya sebagai berikut:
paket edu.sjtu.erplab.ObjectTest;
kelas A
{
void printThreadInfo() yang disinkronkan secara publik menampilkan InterruptedException
{
Utas t=Utas.currentThread();
System.out.println("ID Utas:"+t.getId()+", Nama Utas:"+t.getName());
}
}
kelas publik ObjectWaitTest {
public static void main(String args[])
{
A a=baru A();
//Karena metode printThreadInfo() menampilkan InterruptedException, blok coba-tangkap harus digunakan di sini.
mencoba {
a.printThreadInfo();
menunggu();
} tangkapan (InterruptedException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
}
}
Kesalahan akan dilaporkan ketika program dijalankan, dan hasilnya adalah sebagai berikut:
ThreadID:1, Nama Thread:utama
Pengecualian di thread "utama" java.lang.IllegalMonitorStateException
di java.lang.Object.wait (Metode Asli)
di java.lang.Object.wait(Object.java:485)
di edu.sjtu.erplab.ObjectTest.ObjectWaitTest.main(ObjectWaitTest.java:24)
Seharusnya cara menulisnya benar
Copy kode kodenya sebagai berikut:
paket edu.sjtu.erplab.ObjectTest;
kelas A
{
void printThreadInfo() yang disinkronkan publik menampilkan InterruptedException
{
Utas t=Utas.currentThread();
System.out.println("ID Utas:"+t.getId()+", Nama Utas:"+t.getName());
// ini.tunggu(); //Terus menunggu
this.wait(1000);//Tunggu 1000 md
// super.tunggu(1000);
}
}
kelas publik ObjectWaitTest {
public static void main(String args[])
{
A a=baru A();
//Karena metode printThreadInfo() menampilkan InterruptedException, blok coba-tangkap harus digunakan di sini.
mencoba {
a.printThreadInfo();
//menunggu();
} tangkapan (InterruptedException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
Utas t=Utas.currentThread();
System.out.println("ID Utas:"+t.getId()+", Nama Utas:"+t.getName());
}
}