Jadual Kandungan
1. Keadaan benang (kitaran hayat)
2.5.计时等待状态(TIMED_WAITING)
2.6.终止(TERMINATED)
3.查看线程的6种状态
Rumah Java javaTutorial Apakah 6 keadaan dan kitaran hayat benang Java?

Apakah 6 keadaan dan kitaran hayat benang Java?

May 02, 2023 pm 12:07 PM
java

    1. Keadaan benang (kitaran hayat)

    Sesuatu benang hanya boleh berada dalam satu keadaan pada masa tertentu.

    Benang boleh mempunyai 6 keadaan berikut:

    • Baharu (baru dibuat):

    • Boleh Dijalankan (Boleh Dijalankan ): Utas boleh jalan yang perlu menunggu sumber sistem pengendalian; 🎜>

      Menunggu (menunggu): menunggu status wake-up, menunggu selama-lamanya untuk thread lain untuk bangun; masa Satu utas di mana utas lain menjalankan operasi;
    • Untuk menentukan keadaan semasa benang, anda boleh memanggil kaedah getState
    • Rajah keadaan benang

    • Nota: status kotak bertitik (semua huruf besar Inggeris) ialah status benang Java.

    • 2. Status benang operasi

    • 2.1 Status baru dibuat (BARU)

    bermakna selepas urutan instantiasi selesai, status benang tidak dimulakan.

    Benang boleh dibuat dalam tiga cara

    Timpa kaedah run() kelas Thread

    Apakah 6 keadaan dan kitaran hayat benang Java?

    Laksanakan antara muka Runnable

    Laksanakan antara muka Boleh Panggil

    Contoh mudah meringkaskan tiga cara
      public class Demo {
      
          public static void main(String[] args) throws ExecutionException, InterruptedException {
              /**
               * 1.直接重写run() 或继承Thread类再重写run()
               */
              Thread thread = new Thread() {
                  @Override
                  public void run() {
                      System.out.println("Thread");
                  }
              };
              // 开启线程
              thread.start();
      
              /**
               * 2.lambda、内部类或线程类方式实现Runnable接口,实现run()方法
               * 再交给Thread 类
               */
              Thread runThread = new Thread(() -> {
                  System.out.println("Runnable");
              });
              // 开启线程
              runThread.start();
      
              /**
               * 3.lambda、内部类或线程类方式实现Callable接口,实现call()方法
               * 再交给Thread 类:FutureTask本质也是Runnable实现类
               */
              FutureTask<String> futureTask = new FutureTask<String>(() -> {
                  System.out.println("Callable");
                  return "CallableThread";
              });
              Thread callThread = new Thread(futureTask);
              // 开启线程
              callThread.start();
              // 获取call()方法的返回值
              String s = futureTask.get();
              System.out.println("call()方法的返回值:"+s);
          }
      
      }
      Salin selepas log masuk
    • Jangan tulis semula run() atau call( ) Tidak bermakna untuk membuat instantiat secara langsung urutan yang dibuat oleh kelas Thread;

      Hanya utas yang dibuat dalam kaedah Boleh Panggil boleh memperoleh nilai pulangan benang.
    • 2.2. Keadaan boleh dijalankan (RUNNABLE)

      Keadaan ini merujuk kepada keadaan yang dimasukkan selepas utas membuat instantiat objek dan memanggil kaedah mula(). Benang berada dalam keadaan boleh jalan dan jika terdapat sumber seperti pemproses, atur cara boleh dilaksanakan.
    • Keadaan ini termasuk dua langkah pada

      peringkat sistem pengendalian

      : thread sedia dan thread berjalan, tetapi dalam keadaan thread Java, kedua-dua langkah ini secara kolektif dipanggil keadaan Runnable (runnable).
    Benang bertukar daripada keadaan sedia kepada keadaan berjalan Perkara utama ialah untuk melihat sama ada utas anda telah memperoleh sumber CPU (Sesiapa yang mengambilnya akan menjalankannya, dan jika ia berjaya'). t ambil, tunggu. Oleh kerana hirisan masa CPU (masa pelaksanaan) adalah sangat singkat, kira-kira sepuluh milisaat, masa untuk menukar benang adalah sangat singkat, dan masa untuk keadaan sedia untuk menukar kepada keadaan berjalan juga sangat singkat Keadaan ini hampir tidak kelihatan semasa pembangunan. Perubahan, jadi di Jawa, kedua-duanya dianggap sebagai keseluruhan, memfokuskan pada sama ada benang boleh dijalankan dan membezakannya daripada negeri lain, seterusnya memudahkan pembangunan benang. Jika program anda perlu dijalankan untuk masa yang lama (seperti menulis gelung tak terhingga) dan pelaksanaan tidak selesai dalam sekeping masa CPU, maka utas anda perlu merebut kepingan masa CPU seterusnya Hanya selepas ia telah mencapainya ia terus melaksanakan program Jika ia belum merebutnya, ia boleh terus melaksanakan program Kemudian anda perlu terus merebut sehingga pelaksanaan program dalam utas selesai.

    Malah, anda sepatutnya melihat senario ini sebelum ini, contohnya, apabila berbilang utas melaksanakan program yang sama dan mencetak log ke fail yang sama, log urutan yang berbeza akan dicampur bersama, yang tidak sesuai untuk. soalan penyelesaian masalah. Kaedah biasa untuk menyelesaikan masalah ini ialah: pertama, cetak log ke fail yang berbeza dalam benang yang berbeza kedua, simpan maklumat log ke dalam objek rentetan, dan cetak maklumat log ke fail sekaligus pada akhir program. Kaedah kedua ialah menggunakan kepingan masa CPU untuk melengkapkan pencetakan maklumat log.

    Nota: Program ini hanya boleh memanggil kaedah mula() pada utas dalam keadaan yang baru dibuat Jangan panggil kaedah mula() pada utas dalam

    keadaan bukan baru dibuat

    . Ini akan menyebabkan pengecualian IllegalThreadStateException.

    2.3. Keadaan disekat (DISEKAT)

    Benang berada dalam keadaan disekat semasa

    menunggu monitor kunci

    . Satu benang memperoleh kunci tetapi tidak melepaskannya.

    Keadaan disekat hanya wujud di bawah akses serentak oleh berbilang rangkaian, yang berbeza daripada dua jenis sekatan yang terakhir yang disebabkan oleh urutan itu sendiri memasuki "menunggu".

    Masukkan keadaan

    Masukkan blok/kaedah kod disegerakkan

    Kunci tidak diperoleh

    Status keluar

    • Mendapat kunci monitor

    • 2.4 nyatakan (MENUNGGU)

      Seluruh prosesnya adalah seperti ini: utas memperoleh kunci objek terlebih dahulu dalam kaedah penyegerakan objek; apabila kaedah tunggu dilaksanakan, utas akan melepaskan kunci objek, dan utas diletakkan Masukkan baris gilir menunggu objek ini; tunggu untuk benang lain memperoleh kunci objek yang sama, dan kemudian bangunkan benang dalam baris gilir menunggu objek melalui kaedah notify() atau notifyAll().
    Daripada keseluruhan proses, kita boleh tahu bahawa kaedah

    tunggu (), notify () dan notifyAll () perlu mendapatkan kunci sebelum utas boleh terus dilaksanakan, jadi ketiga-tiga ini kaedah diperlukan Letakkannya dalam blok/kaedah kod yang disegerakkan untuk pelaksanaan, jika tidak pengecualian akan dilaporkan: java.lang.IllegalMonitorStateException.

    在同步代码块中,线程进入WAITING 状态时,锁会被释放,不会导致该线程阻塞。反过来想下,如果锁没释放,那其他线程就没办法获取锁,也就没办法唤醒它。

    进入状态

    • object.wait()

    • thread.join()

    • LockSupport.park()

    退出状态

    • object.notify()

    • object.notifyall()

    • LockSupport.unpark()

    2.5.计时等待状态(TIMED_WAITING)

    一般是计时结束就会自动唤醒线程继续执行后面的程序,对于Object.wait(long) 方法还可以主动通知唤醒。

    注意:Thread类下的sleep() 方法可以放在任意地方执行;而wait(long) 方法和wait() 方法一样,需要放在同步代码块/方法中执行,否则报异常:java.lang.IllegalMonitorStateException。

    进入状态

    • Thread.sleep(long)

    • Object.wait(long)

    • Thread.join(long)

    • LockSupport.parkNanos(long)

    • LockSupport.parkNanos(Object blocker, long nanos)

    • LockSupport.parkUntil(long)

    • LockSupport.parkUntil(Object blocker, long deadline)

    注:blocker 参数为负责此线程驻留的同步对象。

    退出状态

    • 计时结束

    • LockSupport.unpark(Thread)

    • object.notify()

    • object.notifyall()

    2.6.终止(TERMINATED)

    线程执行结束

    • run()/call() 执行完成

    • stop()线程

    • 错误或异常>>意外死亡

    stop() 方法已弃用。

    3.查看线程的6种状态

    通过一个简单的例子来查看线程出现的6种状态。

    案例

    public class Demo3 {
        private static Object object ="obj";
        
        public static void main(String[] args) throws InterruptedException {
    
            Thread thread0 = new Thread(() -> {
                try {
                    // 被阻塞状态(BLOCKED)
                    synchronized (object){
                        System.out.println("thread0 进入:等待唤醒状态(WAITING)");
                        object.wait();
                        System.out.println("thread0 被解除完成:等待唤醒状态(WAITING)");
                    }
                    System.out.println("thread0 "+Thread.currentThread().getState());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
            // 新创建状态(NEW)
            System.out.println(thread0.getName()+":"+thread0.getState());
    
            Thread thread1 = new Thread(() -> {
                try {
                    System.out.println("thread1 进入:计时等待状态(TIMED_WAITING)");
                    Thread.sleep(2);
                    System.out.println("thread1 出来:计时等待状态(TIMED_WAITING)");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 被阻塞状态(BLOCKED)
                synchronized (object){
                    System.out.println("thread1 解除:等待唤醒状态(WAITING)");
                    object.notify();
                    System.out.println("thread1 解除完成:等待唤醒状态(WAITING)");
                }
                System.out.println("thread1 "+Thread.currentThread().getState());
            });
            // 新创建状态(NEW)
            System.out.println(thread1.getName()+":"+thread1.getState());
    
            printState(thread0);
            printState(thread1);
    
            // 可运行状态(RUNNABLE)
            thread0.start();
            // 可运行状态(RUNNABLE)
            thread1.start();
    
        }
        
        
        // 使用独立线程来打印线程状态
        private static void printState(Thread thread) {
            new Thread(()->{
                while (true){
                    System.out.println(thread.getName()+":"+thread.getState());
                    if (thread.getState().equals(Thread.State.TERMINATED)){
                        System.out.println(thread.getName()+":"+thread.getState());
                        break;
                    }
                }
            }).start();
        }
    }
    Salin selepas log masuk

    执行结果:简化后的输出结果

    Thread-0:NEW
    Thread-1:NEW
    Thread-0:RUNNABLE
    Thread-1:RUNNABLE
    thread0 进入:等待唤醒状态(WAITING)
    Thread-1:BLOCKED
    thread1 进入:计时等待状态(TIMED_WAITING)
    Thread-0:BLOCKED
    Thread-0:WAITING
    ……
    Thread-0:WAITING
    Thread-1:BLOCKED
    Thread-1:TIMED_WAITING
    ……
    Thread-1:TIMED_WAITING
    Thread-1:BLOCKED
    ……
    Thread-1:BLOCKED
    Thread-0:WAITING
    ……
    Thread-0:WAITING
    thread1 出来:计时等待状态(TIMED_WAITING)
    Thread-0:WAITING
    Thread-1:BLOCKED
    thread1 解除:等待唤醒状态(WAITING)
    Thread-1:BLOCKED
    Thread-0:WAITING
    Thread-0:BLOCKED
    thread1 解除完成:等待唤醒状态(WAITING)
    Thread-1:BLOCKED
    thread1 RUNNABLE
    Thread-0:BLOCKED
    Thread-1:TERMINATED
    thread0 被解除完成:等待唤醒状态(WAITING)
    Thread-0:BLOCKED
    thread0 RUNNABLE
    Thread-0:TERMINATED

    Apakah 6 keadaan dan kitaran hayat benang Java?

    最终的执行结果如图。

    注意:因为案例中使用了独立线程来打印不同线程的状态,会出现状态打印稍微延迟的情况。

    Atas ialah kandungan terperinci Apakah 6 keadaan dan kitaran hayat benang Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

    Alat AI Hot

    Undresser.AI Undress

    Undresser.AI Undress

    Apl berkuasa AI untuk mencipta foto bogel yang realistik

    AI Clothes Remover

    AI Clothes Remover

    Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

    Undress AI Tool

    Undress AI Tool

    Gambar buka pakaian secara percuma

    Clothoff.io

    Clothoff.io

    Penyingkiran pakaian AI

    Video Face Swap

    Video Face Swap

    Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

    Alat panas

    Notepad++7.3.1

    Notepad++7.3.1

    Editor kod yang mudah digunakan dan percuma

    SublimeText3 versi Cina

    SublimeText3 versi Cina

    Versi Cina, sangat mudah digunakan

    Hantar Studio 13.0.1

    Hantar Studio 13.0.1

    Persekitaran pembangunan bersepadu PHP yang berkuasa

    Dreamweaver CS6

    Dreamweaver CS6

    Alat pembangunan web visual

    SublimeText3 versi Mac

    SublimeText3 versi Mac

    Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

    Nombor Sempurna di Jawa Nombor Sempurna di Jawa Aug 30, 2024 pm 04:28 PM

    Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

    Weka di Jawa Weka di Jawa Aug 30, 2024 pm 04:28 PM

    Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

    Nombor Smith di Jawa Nombor Smith di Jawa Aug 30, 2024 pm 04:28 PM

    Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

    Soalan Temuduga Java Spring Soalan Temuduga Java Spring Aug 30, 2024 pm 04:29 PM

    Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

    Cuti atau kembali dari Java 8 Stream Foreach? Cuti atau kembali dari Java 8 Stream Foreach? Feb 07, 2025 pm 12:09 PM

    Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

    TimeStamp to Date in Java TimeStamp to Date in Java Aug 30, 2024 pm 04:28 PM

    Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

    Program Java untuk mencari kelantangan kapsul Program Java untuk mencari kelantangan kapsul Feb 07, 2025 am 11:37 AM

    Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4

    PHP vs Python: Memahami Perbezaan PHP vs Python: Memahami Perbezaan Apr 11, 2025 am 12:15 AM

    PHP dan Python masing -masing mempunyai kelebihan sendiri, dan pilihannya harus berdasarkan keperluan projek. 1.Php sesuai untuk pembangunan web, dengan sintaks mudah dan kecekapan pelaksanaan yang tinggi. 2. Python sesuai untuk sains data dan pembelajaran mesin, dengan sintaks ringkas dan perpustakaan yang kaya.

    See all articles