Isi yang terlibat dalam bab ini meliputi:
1. Pengantar hasil ()
2. Contoh Hasil ()
3. Perbandingan antara hasil () dan tunggu ()
1. Pengantar hasil ()
Tujuan dari hasil () adalah untuk menyerah. Ini memungkinkan utas saat ini untuk memasuki "keadaan siap" dari "status berjalan", sehingga utas menunggu lainnya dengan prioritas yang sama dapat memperoleh hak eksekusi; memiliki prioritas yang sama.
2. Contoh Hasil ()
Di bawah ini, lihat penggunaannya dengan contoh.
Salinan kode adalah sebagai berikut:
// yieldtest.java kode sumber
class threada memperluas thread {
threada publik (nama string) {
super (nama);
}
void run publik yang disinkronkan () {
untuk (int i = 0; i <10; i ++) {
System.out.printf ("%s [%d]:%d/n", this.getName (), this.getPriority (), i);
// Saat saya membagi 4, hubungi hasil
if (i%4 == 0)
Thread.yield ();
}
}
}
Yieldtest kelas publik {
public static void main (string [] args) {
Threada t1 = threada baru ("t1");
Threada t2 = threada baru ("t2");
t1.start ();
t2.start ();
}
}
(Satu kali) Hasil Operasi:
Salinan kode adalah sebagai berikut:
T1 [5]: 0
T2 [5]: 0
T1 [5]: 1
T1 [5]: 2
T1 [5]: 3
T1 [5]: 4
T1 [5]: 5
T1 [5]: 6
T1 [5]: 7
T1 [5]: 8
T1 [5]: 9
T2 [5]: 1
T2 [5]: 2
T2 [5]: 3
T2 [5]: 4
T2 [5]: 5
T2 [5]: 6
T2 [5]: 7
T2 [5]: 8
T2 [5]: 9
Deskripsi Hasil:
Ketika "Thread T1" dapat disebabkan oleh 4, itu tidak beralih ke "Thread T2". Ini menunjukkan bahwa meskipun hasil () dapat memungkinkan utas untuk memasuki "keadaan siap" dari "status berjalan"; Bahkan jika "utas lain" ini memiliki prioritas yang sama dengan utas yang saat ini memanggil hasil ().
3. Perbandingan antara hasil () dan tunggu ()
Kita tahu bahwa fungsi tunggu () adalah untuk memungkinkan utas saat ini memasuki keadaan "Tunggu (memblokir) dari" status berjalan "dan juga melepaskan kunci sinkronisasi. Fungsi hasil () adalah untuk menyerah, yang juga akan menyebabkan utas saat ini meninggalkan "status berjalan". Perbedaan mereka adalah:
(01) tunggu () adalah membiarkan utas memasukkan status "tunggu (pemblokiran)" dari "status berjalan", sementara tidak menghasilkan () adalah membiarkan utas memasuki "status siap" dari "status berjalan".
(02) tunggu () adalah kunci sinkronisasi yang akan melepas objek yang dipegangnya, sedangkan metode hasil () tidak akan melepaskan kunci.
Contoh berikut menunjukkan bahwa hasil () tidak akan melepaskan kunci.
Salinan kode adalah sebagai berikut:
// kode sumber yieldlocktest.java
YieldLockTest kelas publik {
objek statis privat obj = objek baru ();
public static void main (string [] args) {
Threada t1 = threada baru ("t1");
Threada t2 = threada baru ("t2");
t1.start ();
t2.start ();
}
kelas statis threada memperluas thread {
threada publik (nama string) {
super (nama);
}
public void run () {
// Dapatkan kunci sinkronisasi objek OBJ
disinkronkan (obj) {
untuk (int i = 0; i <10; i ++) {
System.out.printf ("%s [%d]:%d/n", this.getName (), this.getPriority (), i);
// Saat saya membagi 4, hubungi hasil
if (i%4 == 0)
Thread.yield ();
}
}
}
}
}
(Satu kali) Hasil:
Salinan kode adalah sebagai berikut:
T1 [5]: 0
T1 [5]: 1
T1 [5]: 2
T1 [5]: 3
T1 [5]: 4
T1 [5]: 5
T1 [5]: 6
T1 [5]: 7
T1 [5]: 8
T1 [5]: 9
T2 [5]: 0
T2 [5]: 1
T2 [5]: 2
T2 [5]: 3
T2 [5]: 4
T2 [5]: 5
T2 [5]: 6
T2 [5]: 7
T2 [5]: 8
T2 [5]: 9
Deskripsi Hasil:
Dua utas T1 dan T2 dimulai di utas utama. T1 dan T2 akan merujuk pada kunci sinkronisasi objek yang sama dalam run (), yaitu, disinkronkan (OBJ). Selama operasi T1, meskipun akan menghubungi Thread.yield (); Karena T1 tidak melepaskan "kunci sinkron yang dipegang oleh OBJ"!