ตัวอย่าง Java - Get รัฐด้าย
หัวข้อ Java ในวงจรชีวิตสามารถแบ่งออกเป็นห้ารัฐ
- 1. สร้างรัฐใหม่ (ใหม่) สร้างวัตถุหัวข้อใหม่
- 2. รัฐพร้อม (Runnable): หลังจากวัตถุด้ายถูกสร้างขึ้นหัวข้ออื่น ๆ เรียกว่าเริ่มต้น () วิธีการของวัตถุ สถานะของด้ายหัวข้อที่ทำงานในสระว่ายน้ำตั้งอยู่ได้กลายเป็นที่ทำงานได้รอที่จะได้รับสิทธิในการใช้ซีพียู
- สถานะ 3. Run (วิ่ง): ด้ายรัฐพร้อมรับซีพียูโค้ดโปรแกรม
- 4. ปิดกั้น (บล็อค): หัวข้อถูกปิดกั้นด้วยเหตุผลบางอย่างที่จะให้ขึ้นสิทธิที่จะใช้ CPU หยุดทำงานชั่วคราว จนกระทั่งด้ายเข้าสู่สถานะพร้อมโอกาสที่จะไปทำงาน กรณีที่ถูกบล็อกสามประเภท:
- (A) รอสำหรับการปิดกั้น: การดำเนินการเรียกใช้ด้ายรอ () วิธีการ JVM จะด้ายลงไปในสระว่ายน้ำที่รอคอย
- (B), การปิดกั้นการซิงโคร: หัวข้อการทำงานในการได้รับวัตถุของการประสานล็อคถ้าล็อคประสานถูกครอบครองโดยหัวข้ออื่นที่ JVM จะล็อคลงไปในสระด้าย
- (C) อื่น ๆ บล็อก: ทำงานด้ายการดำเนินการนอนหลับ () หรือเข้าร่วม () วิธีการหรือออกคำขอ I / O JVM จะตั้งกระทู้ถูกปิดกั้น เมื่อการนอนหลับ () หมดเวลาการเข้าร่วม () รอด้ายยุติหรือเวลาออกหรือ I / O การประมวลผลเป็นที่เรียบร้อยแล้วด้ายเข้าสู่สถานะพร้อมอีกครั้ง
- 5. รัฐตาย (ตาย): การดำเนินด้ายเนื่องจากความผิดปกติมากกว่าหรือออกจากเมธอด run () ปลายด้ายของวงจรชีวิต
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีการที่จะได้รับสถานะของด้าย:
/* author by w3cschool.cc Main.java */ class MyThread extends Thread{ boolean waiting= true; boolean ready= false; MyThread() { } public void run() { String thrdName = Thread.currentThread().getName(); System.out.println(thrdName + " 启动"); while(waiting) System.out.println("等待:"+waiting); System.out.println("等待..."); startWait(); try { Thread.sleep(1000); } catch(Exception exc) { System.out.println(thrdName + " 中断。"); } System.out.println(thrdName + " 结束。"); } synchronized void startWait() { try { while(!ready) wait(); } catch(InterruptedException exc) { System.out.println("wait() 中断。"); } } synchronized void notice() { ready = true; notify(); } } public class Main { public static void main(String args[]) throws Exception{ MyThread thrd = new MyThread(); thrd.setName("MyThread #1"); showThreadStatus(thrd); thrd.start(); Thread.sleep(50); showThreadStatus(thrd); thrd.waiting = false; Thread.sleep(50); showThreadStatus(thrd); thrd.notice(); Thread.sleep(50); showThreadStatus(thrd); while(thrd.isAlive()) System.out.println("alive"); showThreadStatus(thrd); } static void showThreadStatus(Thread thrd) { System.out.println(thrd.getName()+" 存活:" +thrd.isAlive()+" 状态:" + thrd.getState() ); } }
รหัสดังกล่าวจะดำเนินการส่งออกเป็น:
…… alive alive alive MyThread #1 结束。 alive alive alive alive alive alive alive MyThread #1 存活:false 状态:TERMINATED