1. ลำดับความสำคัญของเธรด
ตัวอย่างการใช้ลำดับความสำคัญของเธรด:
แพ็คเกจ cn.galc.test; Public Class TestThread6 {โมฆะคงที่สาธารณะหลัก (String args []) {mythread4 t4 = ใหม่ mythread4 (); MYTHREAD5 T5 = ใหม่ MYTHREAD5 (); เธรด t1 = เธรดใหม่ (T4); เธรด t2 = เธรดใหม่ (T5); T1.SetPriority (thread.norm_priority + 3); // ใช้วิธีการ setPriority () เพื่อตั้งค่าลำดับความสำคัญของเธรดและที่นี่ลำดับความสำคัญของเธรด T1 ถูกตั้งค่า/** เพิ่มลำดับความสำคัญของเธรด T1 โดยระดับ 3 ตามปกติ t1.start (); t2.start (); System.out.println ("ลำดับความสำคัญของเธรด T1 คือ:" + t1.getPriority ()); // ใช้เมธอด getPriority () เพื่อรับลำดับความสำคัญของเธรดและพิมพ์ลำดับความสำคัญของ T1 เป็น 8}} คลาส mythread4 ใช้งาน runnable {โมฆะสาธารณะเรียกใช้ () {สำหรับ (int i = 0; i <= 1,000; i ++) }}} คลาส mythread5 ใช้งาน runnable {public void run () {สำหรับ (int i = 0; i <= 1,000; i ++) {system.out.println ("======================= }}} ทันทีที่วิธีการเรียกใช้ () สิ้นสุดเธรดจะสิ้นสุด2. การซิงโครไนซ์เธรด
ตัวอย่างการใช้คำหลักที่ซิงโครไนซ์:
แพ็คเกจ CN.GALC.Test; Public Class TestSync ใช้งาน Runnable {ตัวจับเวลาตัวจับเวลา = new Timer (); โมฆะคงที่สาธารณะหลัก (String args []) {testsync test = new TestSync (); เธรด t1 = เธรดใหม่ (ทดสอบ); เธรด t2 = เธรดใหม่ (ทดสอบ); t1.setName ("t1"); // ตั้งชื่อของเธรด t1 t2.setName ("t2"); // ตั้งชื่อของเธรด t2 t1.start (); t2.start (); } โมฆะสาธารณะเรียกใช้ () {timer.add (thread.currentthread (). getName ()); }} ตัวจับเวลาคลาส {ส่วนตัวคงที่ int num = 0; สาธารณะ/ * ซิงโครไนซ์ */void เพิ่ม (ชื่อสตริง) {// เมื่อเพิ่มการซิงโครไนซ์เมื่อประกาศวิธีการหมายความว่าวัตถุปัจจุบันถูกล็อคระหว่างการดำเนินการของวิธีนี้ซิงโครไนซ์ (นี่) {/ * * ใช้การซิงโครไนซ์ (นี้) เพื่อล็อควัตถุปัจจุบัน เฉพาะเมื่อมีการเข้าถึงเธรดหนึ่งรายการเท่านั้นจะเป็นการเปิดเธรดต่อไปเพื่อเข้าถึง */ num ++; ลอง {thread.sleep (1); } catch (interruptedException e) {e.printStackTrace (); } system.out.println (ชื่อ + ": คุณคือ" + num + "เธรดโดยใช้ตัวจับเวลา"); - ปัญหาการหยุดชะงักของกระทู้:
แพ็คเกจ cn.galc.test;/*แอปเพล็ตนี้จำลองปัญหาของเธรด deadlock*/คลาสสาธารณะ testDeadlock ใช้งานการทำงาน {public int flag = 1; วัตถุคงที่ O1 = วัตถุใหม่ (), O2 = วัตถุใหม่ (); โมฆะสาธารณะเรียกใช้ () {system.out.println (thread.currentthread (). getName () + "Flag =" + Flag); /** หลังจากเรียกใช้โปรแกรมฉันพบว่าโปรแกรมได้ดำเนินการแล้วและพิมพ์ธงและฉันจะไม่เรียกใช้คำสั่งที่ตามมาถ้าอีกครั้ง* โปรแกรมเสียชีวิตที่นี่ไม่ได้ดำเนินการหรือออกจาก*//* นี่คือธงเธรด = 1*/ ถ้า (ธง == 1) {ซิงโครไนซ์ } catch (interruptedException e) {e.printStackTrace (); } ซิงโครไนซ์ (O2) { /** วัตถุ O1 ได้รับการล็อคมาก่อนตราบใดที่มันสามารถล็อค O2 คุณสามารถดำเนินการการทำงานของการพิมพ์ออก 1* อย่างไรก็ตามวัตถุ O2 ไม่สามารถล็อคได้ที่นี่เพราะวัตถุ O1 ถูกล็อคในธงอื่น = 0* }}}} /** ทั้งสองถ้าคำสั่งที่นี่จะไม่ถูกดำเนินการเพราะพวกเขาทำให้เกิดปัญหาของเธรด Deadlock* Flag = 1 เธรดนี้กำลังรอธง = 0 เธรดนี้กำลังปลดล็อควัตถุ O2,* และ Flag = 0 เธรดนี้กำลังรอธง = 1 flag = 0*/ if (flag == 0) {ซิงโครไนซ์ (O2) {/*ที่นี่เราใช้ซิงโครไนซ์เพื่อล็อควัตถุ O2 ก่อน*/ ลอง {thread.sleep (500); } catch (interruptedException e) {e.printStackTrace (); } ซิงโครไนซ์ (O1) { / * * วัตถุ O2 ถูกล็อคมาก่อน ตราบใดที่มันสามารถล็อค O1 การทำงานของการพิมพ์ออก 0 สามารถทำได้ อย่างไรก็ตามวัตถุ O1 ไม่สามารถล็อคได้ที่นี่เนื่องจาก Object O1 ถูกล็อคในเธรดอื่นของ Flag = 1 แม้ว่าเธรดที่ล็อควัตถุ O1 จะนอนหลับทุก ๆ 500 มิลลิวินาที แต่ก็ยังคงล็อค O1 เมื่อนอนหลับ*/ System.out.println ("0"); }}}} โมฆะคงที่สาธารณะหลัก (สตริง args []) {testDeadlock td1 = testDeadlock ใหม่ (); testDeadlock td2 = ใหม่ testDeadlock (); td1.flag = 1; td2.flag = 0; เธรด t1 = เธรดใหม่ (TD1); เธรด t2 = เธรดใหม่ (TD2); t1.setName ("เธรด td1"); t2.setName ("เธรด td2"); t1.start (); t2.start (); -เป็นการดีที่สุดที่จะแก้ปัญหาของเธรด deadlocking เพียงวัตถุเดียวไม่ใช่สองวัตถุในเวลาเดียวกัน
คำถามผู้ผลิตและผู้บริโภค:
แพ็คเกจ cn.galc.test;/* ตัวอย่างชื่อ: ผู้ผลิต-ปัญหาผู้บริโภค* ชื่อไฟล์แหล่งที่มา: Producerconsumer.java* ประเด็นสำคัญ:* 1. ความไม่สอดคล้องกันของข้อมูลที่ใช้ร่วมกัน/การปกป้องทรัพยากรที่สำคัญ* 2. แนวคิดของ Java Object Lock* 3. คำหลักที่ซิงโครไนซ์ = syncstack ใหม่ (); Runnable P = ผู้ผลิตรายใหม่ (สแต็ค); Runnable C = ผู้บริโภคใหม่ (สแต็ค); เธรด p1 = เธรดใหม่ (p); เธรด c1 = เธรดใหม่ (c); P1.Start (); c1.start (); }} คลาส SyncStack {// การใช้งานของสแต็กที่รองรับการดำเนินการซิงโครไนซ์แบบมัลติเธรดดัชนีส่วนตัว INT ดัชนี = 0; ถ่านส่วนตัว [] ข้อมูล = ถ่านใหม่ [6]; โมฆะแบบซิงโครไนซ์สาธารณะ (ถ่าน C) {ถ้า (index == data.length) {ลอง {this.wait (); } catch (interruptedException e) {}} this.notify (); ข้อมูล [ดัชนี] = C; ดัชนี ++; } public synchronized ถ่าน pop () {if (index == 0) {ลอง {this.wait (); } catch (interruptedException e) {}} this.notify (); ดัชนี--; ส่งคืนข้อมูล [ดัชนี]; }} ผู้ผลิตคลาสใช้งาน {syncStack stack; ผู้ผลิตสาธารณะ (SyncStack S) {stack = s; } โมฆะสาธารณะเรียกใช้ () {สำหรับ (int i = 0; i <20; i ++) {char c = (char) (math.random ()*26+'a'); stack.push (c); System.out.println ("ผลิต:"+c); ลอง {thread.sleep ((int) (math.random ()*1000)); } catch (interruptedException e) {}}}} ผู้บริโภคในชั้นเรียนใช้งาน {syncStack stack; ผู้บริโภคสาธารณะ (SyncStack S) {stack = s; } โมฆะสาธารณะเรียกใช้ () {สำหรับ (int i = 0; i <20; i ++) {char c = stack.pop (); System.out.println ("การบริโภค:"+c); ลอง {thread.sleep ((int) (math.random ()*1000)); } catch (interruptedException e) {}}}}ข้างต้นเป็นการแนะนำเต็มรูปแบบของกระทู้ Java คุณสามารถรวมบทความแรก "Java ต้องเรียนรู้และเรียนรู้หัวข้อ (1)" เพื่อเรียนรู้โดยหวังว่าจะช่วยคุณได้