Isi yang terlibat dalam bab ini meliputi:
1. Pengantar tidur ()
2. Contoh tidur ()
3. Perbandingan antara tidur () dan tunggu ()
1. Pengantar tidur ()
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; CPU yang akan dijadwalkan untuk dieksekusi.
2. Contoh tidur ()
Berikut ini adalah contoh sederhana untuk menunjukkan penggunaan tidur ().
Salinan kode adalah sebagai berikut:
// Sumber kode sleeptest.java
class threada memperluas thread {
threada publik (nama string) {
super (nama);
}
void run publik yang disinkronkan () {
mencoba {
untuk (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Saat saya bisa dibagi dengan 4, tidur selama 100 milidetik
if (i%4 == 0)
Thread.sleep (100);
}
} catch (InterruptedException e) {
e.printstacktrace ();
}
}
}
Sleeptest kelas publik {
public static void main (string [] args) {
Threada t1 = threada baru ("t1");
t1.start ();
}
}
Hasil Menjalankan:
Salinan kode adalah sebagai berikut:
T1: 0
T1: 1
T1: 2
T1: 3
T1: 4
T1: 5
T1: 6
T1: 7
T1: 8
T1: 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 antara tidur () 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 tidur () adalah membiarkan utas saat ini memasuki status "Tidur (memblokir)" dari "keadaan berjalan".
Namun, tunggu () melepaskan kunci sinkronisasi objek, sementara tidur () tidak melepaskan kunci.
Contoh berikut menunjukkan bahwa tidur () tidak akan melepaskan kunci.
Salinan kode adalah sebagai berikut:
// Kode Sumber Sleeplocktest.java
SleepLockTest 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) {
mencoba {
untuk (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Saat saya bisa dibagi dengan 4, tidur selama 100 milidetik
if (i%4 == 0)
Thread.sleep (100);
}
} catch (InterruptedException e) {
e.printstacktrace ();
}
}
}
}
}
Hasil Menjalankan:
Salinan kode adalah sebagai berikut:
T1: 0
T1: 1
T1: 2
T1: 3
T1: 4
T1: 5
T1: 6
T1: 7
T1: 8
T1: 9
T2: 0
T2: 1
T2: 2
T2: 3
T2: 4
T2: 5
T2: 6
T2: 7
T2: 8
T2: 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); 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):
Salinan kode adalah sebagai berikut:
// kode sumber sleeplocktest.java (dikomentari disinkronkan (OBJ))
SleepLockTest 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) {
mencoba {
untuk (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Saat saya bisa dibagi dengan 4, tidur selama 100 milidetik
if (i%4 == 0)
Thread.sleep (100);
}
} catch (InterruptedException e) {
e.printstacktrace ();
}
//}
}
}
}