Rumah  >  Artikel  >  Java  >  Perbincangan mendalam tentang mekanisme dan skop aplikasi perubahan keadaan benang Java

Perbincangan mendalam tentang mekanisme dan skop aplikasi perubahan keadaan benang Java

WBOY
WBOYasal
2024-02-18 14:52:06511semak imbas

Perbincangan mendalam tentang mekanisme dan skop aplikasi perubahan keadaan benang Java

Prinsip dan senario aplikasi peralihan keadaan benang Java

Pengenalan:
Java, sebagai bahasa pengaturcaraan berbilang benang, menggunakan benang untuk mencapai pelaksanaan serentak dan meningkatkan kecekapan pelaksanaan program. Di Jawa, keadaan benang ialah konsep yang sangat penting, yang menentukan operasi yang boleh dilakukan oleh benang dan keadaan di mana ia dikendalikan. Artikel ini akan menganalisis peralihan keadaan benang Java daripada dua aspek: prinsip dan senario aplikasi.

1. Prinsip peralihan keadaan benang
Di Java, utas mempunyai enam keadaan: Baharu, Boleh Dijalankan, Disekat, Menunggu, Menunggu Bermasa dan Ditamatkan. Status benang ditukar dengan memanggil kaedah yang berbeza.

  1. Keadaan baharu:
    Apabila kita mencipta objek benang dan memanggil kaedah mula(), benang berada dalam keadaan Baharu. Benang dalam keadaan Baharu belum mula berjalan Ia boleh dimulakan dengan memanggil kaedah mula().

Contoh kod:

Thread thread = new Thread();
thread.start();
  1. Keadaan boleh dijalankan:
    Apabila thread dimulakan, ia akan memasuki keadaan Runnable. Benang dalam keadaan Runnable sedang berjalan dalam mesin maya Java Ia mungkin sedang melaksanakan atau menunggu beberapa sumber.

Contoh kod:

public class MyThread implements Runnable{
    public void run(){
        // 线程执行的代码逻辑
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
    }
}
  1. Keadaan disekat:
    Jika benang sedang menunggu untuk memperoleh kunci dan benang lain telah memperoleh kunci, benang akan memasuki keadaan Disekat. Benang dalam keadaan Disekat akan menunggu benang lain melepaskan kunci, dan kemudian bersaing untuk memperoleh kunci.

Contoh kod:

public class MyThread implements Runnable{
    public void run(){
        synchronized (lock){
            // 获取锁之后执行的代码逻辑
        }
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread1 = new MyThread();
        MyThread myThread2 = new MyThread();
        Thread thread1 = new Thread(myThread1);
        Thread thread2 = new Thread(myThread2);
        thread1.start();
        thread2.start();
    }
}
  1. Keadaan menunggu:
    Apabila benang menunggu syarat tertentu dipenuhi, ia akan memasuki keadaan Menunggu. Keadaan menunggu boleh menjadi pemberitahuan daripada urutan lain atau ketibaan masa yang ditentukan.

Contoh kod:

public class MyThread implements Runnable{
    public void run(){
        synchronized (lock){
            try{
                lock.wait(); // 等待其他线程的通知
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
        
        // 唤醒等待的线程
        synchronized (lock){
            lock.notify();
        }
    }
}
  1. Keadaan Menunggu Bermasa:
    Apabila benang gagal memperoleh kunci atau syarat lain tidak dipenuhi selepas menunggu masa yang ditentukan, ia akan memasuki keadaan Menunggu Bermasa.

Contoh kod:

public class MyThread implements Runnable{
    public void run(){
        try{
            Thread.sleep(2000); // 等待2秒钟
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
    }
}
  1. Keadaan ditamatkan:
    Apabila kaedah run() thread selesai melaksanakan, thread akan memasuki keadaan Terminated. Urutan dalam keadaan Ditamatkan telah menamatkan pelaksanaan.

Contoh kod:

public class MyThread implements Runnable{
    public void run(){
        // 线程执行的代码逻辑
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
        try{
            thread.join(); // 等待线程执行完成
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }
}

2. Senario aplikasi penukaran keadaan benang
Penukaran keadaan benang mempunyai pelbagai senario aplikasi dalam pengaturcaraan berbilang benang. Bergantung pada status benang, kita boleh melaksanakan gelagat benang yang berbeza.

  1. Gunakan keadaan Disekat untuk mencapai akses yang saling eksklusif antara urutan:
    Dalam sesetengah senario aplikasi, kami perlu memastikan akses yang saling eksklusif kepada sumber yang dikongsi oleh berbilang rangkaian. Kita boleh menggunakan keadaan Disekat untuk mencapai akses eksklusif antara benang.

Contoh kod:

public class MyThread implements Runnable{
    public void run(){
        synchronized(lock){
            // 代码操作
        }
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread thread1 = new Thread(myThread);
        Thread thread2 = new Thread(myThread);
        thread1.start();
        thread2.start();
    }
}
  1. Gunakan keadaan menunggu untuk mencapai kerjasama antara utas:
    Untuk mencapai kerjasama antara utas, utas perlu menunggu pemberitahuan daripada urutan lain sebelum meneruskan pelaksanaan. Pada masa ini, keadaan Menunggu boleh digunakan untuk mencapai kerjasama antara utas.

Contoh kod:

public class MyThread implements Runnable{
    public void run(){
        synchronized(lock){
            try{
                lock.wait(); // 等待其他线程的通知
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            
            // 继续执行
        }
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
        
        // 唤醒等待的线程
        synchronized (lock){
            lock.notify();
        }
    }
}
  1. Gunakan keadaan Menunggu Bermasa untuk melaksanakan tugas berjadual:
    Dalam sesetengah senario, kita perlu melaksanakan tugasan tertentu dengan kerap Dalam kes ini, keadaan Menunggu Bermasa boleh digunakan untuk mencapai pelaksanaan berjadual.

Contoh kod:

public class MyThread implements Runnable{
    public void run(){
        try{
            Thread.sleep(2000); // 等待2秒钟
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        
        // 执行定时任务
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
    }
}

Ringkasan:
Artikel ini menerangkan proses penukaran keadaan thread Java secara terperinci dengan memperkenalkan prinsip dan senario aplikasi penukaran keadaan thread Java, dan memberikan contoh kod yang sepadan. Memahami prinsip dan senario aplikasi peralihan keadaan benang adalah sangat penting untuk pengaturcaraan berbilang benang. Saya harap artikel ini dapat membantu pembaca.

Atas ialah kandungan terperinci Perbincangan mendalam tentang mekanisme dan skop aplikasi perubahan keadaan benang Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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