Contoh Java - Dapatkan negara thread
Java benang dalam siklus hidup dapat dibagi menjadi lima negara.
- 1. Buat negara baru (New): membuat objek thread baru.
- 2. keadaan siap (Runnable): Setelah objek benang dibuat, thread lain memanggil start () method dari objek. Keadaan benang benang runnable di kolam renang terletak, telah menjadi runnable, menunggu untuk memperoleh hak untuk menggunakan CPU.
- 3. Jalankan Status (Running): siap negara thread mendapat CPU, mengeksekusi kode program.
- 4. diblokir (Diblokir): benang diblokir untuk beberapa alasan untuk menyerah hak untuk menggunakan CPU sementara berhenti berjalan. Sampai benang ke dalam keadaan siap, kesempatan untuk pergi berjalan. Kasus diblokir tiga kategori:
- (A), menunggu memblokir: eksekusi menunggu benang run () metode, JVM akan benang ke dalam menunggu kolam renang.
- (B), blocking sinkron: benang berjalan dalam memperoleh objek kunci sinkronisasi, jika kunci sinkronisasi ditempati oleh thread lain, JVM akan mengunci ke dalam kolam benang.
- Metode menjalankan eksekusi thread tidur () atau bergabung (), atau mengeluarkan permintaan I / O, JVM akan mengatur benang diblokir: (C) Lainnya diblokir. Ketika tidur () timeout, bergabung () menunggu thread berakhir atau kali keluar, atau I / pengolahan O selesai, benang ke negara siap lagi.
- 5. negara kematian (Mati): eksekusi thread karena yang abnormal lebih atau keluar dari metode run (), akhir benang dari siklus hidup.
Contoh berikut menunjukkan bagaimana untuk mendapatkan keadaan benang:
/* 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() ); } }
Kode di atas dijalankan output:
…… alive alive alive MyThread #1 结束。 alive alive alive alive alive alive alive MyThread #1 存活:false 状态:TERMINATED