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