Konsesi Thread: Yield ()
Tujuan dari hasil () adalah untuk menyerah. Ini dapat memungkinkan utas saat ini untuk memasuki "keadaan siap" dari "status berjalan", sehingga utas menunggu lainnya dengan prioritas yang sama dapat memperoleh hak eksekusi; Namun, itu tidak dapat menjamin bahwa setelah hasil panggilan utas saat ini (), utas lain dengan prioritas yang sama pasti akan mendapatkan hak eksekusi; Mungkin juga utas saat ini memasuki "keadaan berjalan" dan terus berjalan!
Contoh:
class threada memperluas thread {public threada (name string) {super (name); } public disinkronkan void run () {for (int i = 0; i <10; i ++) {System.out.printf ("%s [%d]:%d/n", this.getname (), this.getPriority (), i); // Ketika saya dibagi dengan 4, hubungi hasil jika (i%4 == 0) thread.yield (); }}} kelas publik yieldtest {public static void main (string [] args) {threada t1 = new threada ("t1"); Threada t2 = threada baru ("t2"); t1.start (); t2.start (); }} (Satu kali) Hasil Operasi:
t1 [5]:0t2 [5]:0t1 [5]:1t1 [5]:2t1 [5]:3t1 [5]:4t1 [5]:5t1 [5]:6t1 [5]:7t1 [5]:8t1 [5]:9t2 [5]:1t2 [5]:2t2 [5]:3t2 [5]:4t2 [5]:5t2 [5]: 6T2 [5]: 7T2 [5]: 8T2 [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", itu tidak selalu memungkinkan utas lain untuk mendapatkan hak eksekusi CPU (mis., Utas lain memasuki "status berjalan"), bahkan jika "utas lain" ini memiliki prioritas yang sama dengan utas yang saat ini panggilan hasil ().
Perbandingan 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" keadaan berjalan ". Perbedaannya adalah:
(1) Tunggu () adalah membiarkan utas memasukkan status "tunggu (pemblokiran)" dari "keadaan berjalan", sementara tidak menghasilkan () adalah membiarkan utas memasuki "status siap" dari "status berjalan".
(2) 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:
public class yieldlocktest {private static objek obj = new objek (); public static void main (string [] args) {threada t1 = new threada ("t1"); Threada t2 = threada baru ("t2"); t1.start (); t2.start (); } kelas statis threada memperluas thread {public threada (name string) {super (name); } public void run () {// Dapatkan disinkronkan (obj) {for (int i = 0; i <10; i ++) {System.out.printf ("%s [%d]:%d/n", this.getName (), this.getPriority (), i); // Ketika saya dibagi dengan 4, hubungi hasil jika (i%4 == 0) thread.yield (); }}}}}} (Satu kali) Hasil:
T1 [5]: 0T1 [5]: 1T1 [5]: 2T1 [5]: 3T1 [5]: 4T1 [5]: 5T1 [5]: 6T1 [5]: 7T1 [5]: 8T1 [5]: 9t2 [5]: 0t2 [5]: 1T2 [5]: 2T2 [5]: 5t2 [5]: 5t2 [5]: 1T2 [5]: 2T2 [5]: 5T2 [5]: 5T2 [5]: 5T2 [5]:: [5]: 6T2 [5]: 7T2 [5]: 8T2 [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 memanggil thread.yield (); T2 tidak akan mendapatkan hak eksekusi CPU. Karena T1 tidak melepaskan "kunci sinkron yang dipegang oleh OBJ"!
Thread Sleep: Sleep ()
sleep () didefinisikan dalam thread.java.
Fungsi tidur () adalah membiarkan utas saat ini tidur, yaitu utas saat ini akan masuk dari "status berjalan" ke "status tidur (pemblokiran)". sleep () akan menentukan waktu tidur, dan waktu tidur utas akan lebih besar dari/sama dengan waktu tidur; Ketika utas dibangunkan lagi, itu akan berubah dari "status pemblokiran" menjadi "keadaan siap", menunggu CPU dijadwalkan untuk dieksekusi.
Contoh:
class threada memperluas thread {public threada (name string) {super (name); } public disinkronkan void run () {coba {for (int i = 0; i <10; i ++) {System.out.printf (" %s: %d/n", this.getName (), i); // Ketika saya dapat dibagi dengan 4, tidur selama 100ms jika (i%4 == 0) thread.sleep (100); }} catch (InterruptedException e) {E.PrintStackTrace (); }}} kelas publik sleeptest {public static void main (string [] args) {threada t1 = new threada ("t1"); t1.start (); }} Hasil Menjalankan:
T1: 0T1: 1T1: 2T1: 3T1: 4T1: 5T1: 6T1: 7T1: 8T1: 9
Deskripsi Hasil:
Program ini relatif sederhana, mulai utas T1 di utas utama utama. Setelah T1 dimulai, ketika perhitungan I di T1 dapat dibagi dengan 4, T1 akan tidur selama 100 milidetik melalui benang. Tidur (100).
Perbandingan tidur () dan tunggu ():
Kita tahu bahwa fungsi tunggu () adalah untuk memungkinkan utas saat ini memasuki status "tunggu (memblokir) dari" status berjalan "dan juga melepaskan kunci sinkronisasi. Fungsi tidur () adalah untuk membiarkan utas saat ini memasuki" status tidur (pemblokir) "dari" status berjalan ".
Namun, tunggu () melepaskan kunci sinkronisasi objek, sementara tidur () tidak melepaskan kunci.
Contoh berikut menunjukkan bahwa tidur () tidak akan melepaskan kunci.
kelas publik sleeplocktest {private static objek obj = objek baru (); public static void main (string [] args) {threada t1 = new threada ("t1"); Threada t2 = threada baru ("t2"); t1.start (); t2.start (); } kelas statis threada memperluas thread {public threada (name string) {super (name); } public void run () {// Dapatkan kunci sinkronisasi objek OBJ yang disinkronkan (obj) {coba {untuk (int i = 0; i <10; i ++) {System.out.printf (" %s: %d/n", this.getName (), i); // Ketika saya dapat dibagi dengan 4, tidur selama 100ms jika (i%4 == 0) thread.sleep (100); }} catch (InterruptedException e) {E.PrintStackTrace (); }}}}}}}}} Hasil Menjalankan:
T1: 0T1: 1T1: 2T1: 3T1: 4T1: 5T1: 6T1: 7T1: 8T1: 9T2: 0T2: 1T2: 2T2: 3T2: 4T2: 5T2: 6T2: 7T2: 8T2: 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 berjalan T1, meskipun akan memanggil Thread.sleep (100); T2 tidak akan mendapatkan hak eksekusi CPU. Karena T1 tidak melepaskan "kunci sinkron yang dipegang oleh OBJ"!
Perhatikan bahwa jika kami mengomentari sinkronisasi (OBJ) dan menjalankan program lagi, T1 dan T2 dapat saling beralih. Berikut ini adalah kode sumber setelah tune komentar disinkronkan (OBJ):
kelas publik sleeplocktest {private static objek obj = objek baru (); public static void main (string [] args) {threada t1 = new threada ("t1"); Threada t2 = threada baru ("t2"); t1.start (); t2.start (); } kelas statis threada memperluas thread {public threada (name string) {super (name); } public void run () {// Dapatkan kunci sinkronisasi objek OBJ // disinkronkan (obj) {coba {untuk (int i = 0; i <10; i ++) {System.out.printf (" %s: %d/n", this.getName (), i); // Ketika saya dapat dibagi dengan 4, tidur selama 100ms jika (i%4 == 0) thread.sleep (100); }} catch (InterruptedException e) {E.PrintStackTrace (); } //}}}}