เนื้อหาที่เกี่ยวข้องในบทนี้รวมถึง:
1. บทนำสู่การนอนหลับ ()
2. sleep () ตัวอย่าง
3. การเปรียบเทียบระหว่างการนอนหลับ () และรอ ()
1. บทนำสู่การนอนหลับ ()
sleep () ถูกกำหนดไว้ใน Thread.java
ฟังก์ชั่นของ Sleep () คือการปล่อยให้ด้ายปัจจุบันนอนหลับนั่นคือเธรดปัจจุบันจะเข้าสู่ "สถานะการทำงาน" ไปยังสถานะ "การนอนหลับ (บล็อก)" sleep () จะระบุเวลาการนอนหลับและเวลานอนด้ายจะมากกว่า/เท่ากับเวลานอน CPU จะถูกกำหนดให้ดำเนินการ
2. sleep () ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างง่ายๆในการแสดงการใช้การนอนหลับ ()
การคัดลอกรหัสมีดังนี้:
// ซอร์สโค้ดของ sleeptest.java
คลาส Threada ขยายเธรด {
Threada สาธารณะ (ชื่อสตริง) {
super (ชื่อ);
-
เป็นโมฆะแบบซิงโครไนซ์สาธารณะ () {
พยายาม {
สำหรับ (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// เมื่อฉันสามารถแบ่ง 4 นอนได้ 100 มิลลิวินาที
ถ้า (i%4 == 0)
Thread.sleep (100);
-
} catch (interruptedException e) {
E.PrintStackTrace ();
-
-
-
การนอนหลับระดับสาธารณะ {
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {
threada t1 = threada ใหม่ ("t1");
t1.start ();
-
-
ผลการทำงาน:
การคัดลอกรหัสมีดังนี้:
T1: 0
T1: 1
T1: 2
T1: 3
T1: 4
T1: 5
T1: 6
T1: 7
T1: 8
T1: 9
ผลลัพธ์คำอธิบาย:
โปรแกรมค่อนข้างง่ายเริ่มเธรด T1 ใน Main Thread Main หลังจาก T1 เริ่มต้นขึ้นเมื่อการคำนวณ I ใน T1 สามารถหารได้ 4, T1 จะนอนหลับได้ 100 มิลลิวินาทีผ่าน Thread.sleep (100)
การเปรียบเทียบระหว่างการนอนหลับ () และรอ ()
เรารู้ว่าฟังก์ชั่นของการรอคอย () คือการอนุญาตให้เธรดปัจจุบันเข้าสู่สถานะ "รอ (บล็อก) จาก" สถานะการรัน "และปล่อยล็อคการซิงโครไนซ์ ฟังก์ชั่นของ Sleep () คือการให้เธรดปัจจุบันป้อนสถานะ "การนอนหลับ (บล็อก)" จาก "สถานะการทำงาน"
อย่างไรก็ตามรอ () ปล่อยล็อคการซิงโครไนซ์ของวัตถุในขณะที่ Sleep () ไม่ปล่อยล็อค
ตัวอย่างต่อไปนี้แสดงให้เห็นว่า sleep () จะไม่ปล่อยล็อค
การคัดลอกรหัสมีดังนี้:
// ซอร์สโค้ดของ sleeplocktest.java
ชั้นเรียนสาธารณะ sleeplocktest {
วัตถุคงที่ส่วนตัว OBJ = วัตถุใหม่ ();
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {
threada t1 = threada ใหม่ ("t1");
threada t2 = threada ใหม่ ("t2");
t1.start ();
t2.start ();
-
Threada คลาสคงที่ขยายเธรด {
Threada สาธารณะ (ชื่อสตริง) {
super (ชื่อ);
-
โมฆะสาธารณะเรียกใช้ () {
// รับการล็อคการซิงโครไนซ์ของวัตถุ OBJ
ซิงโครไนซ์ (obj) {
พยายาม {
สำหรับ (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// เมื่อฉันสามารถแบ่ง 4 นอนได้ 100 มิลลิวินาที
ถ้า (i%4 == 0)
Thread.sleep (100);
-
} catch (interruptedException e) {
E.PrintStackTrace ();
-
-
-
-
-
ผลการทำงาน:
การคัดลอกรหัสมีดังนี้:
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
ผลลัพธ์คำอธิบาย:
สองเธรด T1 และ T2 เริ่มต้นใน Main Thread Main T1 และ T2 จะอ้างถึงการล็อคการซิงโครไนซ์ของวัตถุเดียวกันใน Run () นั่นคือซิงโครไนซ์ (OBJ) ในระหว่างการทำงานของ T1 แม้ว่ามันจะเรียกว่า thread.sleep (100); เพราะ T1 ไม่ปล่อย "ล็อคแบบซิงโครนัสที่จัดขึ้นโดย OBJ"!
โปรดทราบว่าหากเราแสดงความคิดเห็นออกซิงโครไนซ์ (OBJ) และดำเนินการโปรแกรมอีกครั้ง T1 และ T2 สามารถเปลี่ยนไปใช้กันได้ ต่อไปนี้เป็นซอร์สโค้ดหลังจากการปรับความคิดเห็นที่ซิงโครไนซ์ (OBJ):
การคัดลอกรหัสมีดังนี้:
// sleeplocktest.java ซอร์ส
ชั้นเรียนสาธารณะ sleeplocktest {
วัตถุคงที่ส่วนตัว OBJ = วัตถุใหม่ ();
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {
threada t1 = threada ใหม่ ("t1");
threada t2 = threada ใหม่ ("t2");
t1.start ();
t2.start ();
-
Threada คลาสคงที่ขยายเธรด {
Threada สาธารณะ (ชื่อสตริง) {
super (ชื่อ);
-
โมฆะสาธารณะเรียกใช้ () {
// รับการล็อคการซิงโครไนซ์ของวัตถุ OBJ
// ซิงโครไนซ์ (obj) {
พยายาม {
สำหรับ (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// เมื่อฉันสามารถแบ่ง 4 นอนได้ 100 มิลลิวินาที
ถ้า (i%4 == 0)
Thread.sleep (100);
-
} catch (interruptedException e) {
E.PrintStackTrace ();
-
-
-
-
-