ในการเขียนโปรแกรมแบบมัลติเธรด Java ประเภท java.lang.Thread มีชุดของวิธีการ start(), stop(), stop(Throwable) และ Suspend(), destroy() และ resume() ด้วยวิธีการเหล่านี้ เราสามารถดำเนินการได้อย่างสะดวกบนเธรด แต่ในวิธีการเหล่านี้ จะคงไว้เพียงเมธอด start() เท่านั้น
เหตุผลในการละทิ้งวิธีการเหล่านี้มีการอธิบายโดยละเอียดในบทความโดย Sun "เหตุใด Thread.stop, Thread.suspend และ Thread.resume จึงเลิกใช้แล้ว"
หากคุณต้องการยุติเธรดจริงๆ คุณสามารถใช้วิธีการต่อไปนี้:
1. ปล่อยให้เมธอด run() ของเธรดดำเนินการเสร็จสิ้นและเธรดสิ้นสุดอย่างเป็นธรรมชาติ (วิธีนี้ดีที่สุด)
2. สิ้นสุดเธรดโดยการโพลและแบ่งปันบิตแฟล็ก เช่น while(flag){} ค่าเริ่มต้นของแฟล็กจะถูกตั้งค่าเป็นจริง และเมื่อจำเป็นต้องยุติ ให้ตั้งค่าแฟล็กเป็นเท็จ (วิธีนี้ก็ไม่ค่อยดีนักเช่นกัน เพราะถ้าเมธอด while(flag){} ถูกบล็อก แฟล็กก็จะไม่ถูกต้อง)
หยุดบูลีนระเหยส่วนตัว = false;
โมฆะสาธารณะยุติ () {
หยุด = จริง;
-
โมฆะสาธารณะวิ่ง () {
ในขณะที่ (หยุด) {
// ... ข้อความบางส่วน
-
-
-
หากเธรดเข้าสู่สถานะ Not Runnable เนื่องจากการดำเนินการ sleep() หรือ wait() หากเป็น wait() เธรดจะไม่ทำงานหากใช้แฟล็กบิต
การรอโมฆะขั้นสุดท้ายสาธารณะ (หมดเวลานาน)
พ่น InterruptedException วิธีการนี้ทำให้เธรดปัจจุบัน (เรียกว่า T) เพื่อวางตัวเองในชุดการรอของวัตถุ และจากนั้น ละทิ้งข้อกำหนดการซิงโครไนซ์ทั้งหมดบนวัตถุนี้ นั่นคือ เธรดปัจจุบันกลายเป็นสถานะรอ
การใช้งานมาตรฐานของ wait()
ซิงโครไนซ์ (obj) {
ในขณะที่(<ไม่ตรงตามเงื่อนไข>){
obj.รอ();
-
กระบวนการแปรรูปที่ตรงตามเงื่อนไข
-
และคุณต้องการหยุดมัน คุณสามารถใช้อันที่สามได้เช่น
3. ใช้ Interrupted() และโปรแกรมจะส่งข้อยกเว้น InterruptedException ซึ่งจะทำให้เธรดการดำเนินการออกจากเมธอด run()
ตัวอย่างเช่น:
คลาสสาธารณะ SomeThread {
โมฆะสาธารณะคง main (String [] args)
-
เธรดเธรด = เธรดใหม่ (เรียกใช้ใหม่ () {
โมฆะสาธารณะวิ่ง () {
ในขณะที่ (!Thread.interrupted()) {
// ประมวลผลงานที่จะประมวลผล
พยายาม {
System.out.println("เข้าสู่โหมดสลีป");
เธรด.สลีป(1,000);
} จับ (InterruptedException e) {
e.printStackTrace();
System.out.println("ฉันถูกขัดจังหวะ!");
-
-
เธรด.เริ่มต้น();
เธรด.ขัดจังหวะ();
-
-
ไปนอนแล้ว
ฉันถูกขัดจังหวะ!