Rumah >Java >javaTutorial >Cara menggunakan kaedah objek tunggu dan beritahu dengan betul dalam Java

Cara menggunakan kaedah objek tunggu dan beritahu dengan betul dalam Java

PHPz
PHPzasal
2023-12-20 13:30:51828semak imbas

Cara menggunakan kaedah objek tunggu dan beritahu dengan betul dalam Java

Cara menggunakan kaedah objek dengan betul dalam Java: tunggu dan maklumkan

Di Java, tunggu dan maklumkan ialah kaedah penting yang digunakan untuk mencapai kerjasama antara berbilang benang. Penggunaan betul kedua-dua kaedah ini boleh mengelakkan masalah berbilang benang seperti keadaan perlumbaan dan kebuntuan, dan memastikan keselamatan dan kecekapan program. Artikel ini akan memperkenalkan cara menggunakan kaedah objek tunggu dan maklumkan dengan betul dalam Java dan memberikan contoh kod khusus.

1. Prinsip asas dan fungsi tunggu dan maklumkan

Sebelum memahami cara menggunakan tunggu dan beritahu dengan betul, anda perlu memahami prinsip dan fungsi asasnya.

  1. tunggu: Letakkan utas semasa dalam keadaan menunggu sehingga utas lain membangunkannya melalui kaedah notify atau notifyAll. Menggunakan kaedah tunggu boleh melepaskan kunci objek dan menyekat benang semasa dengan berkesan, menyebabkan ia menangguhkan pelaksanaan.
  2. beritahu: Bangunkan benang menunggu pada objek. Jika terdapat berbilang rangkaian menunggu, notify hanya akan membangunkan satu rangkaian secara rawak dan urutan khusus untuk bangun tidak pasti.
  3. notifyAll: Bangunkan semua rangkaian menunggu pada objek ini. Gunakan kaedah notifyAll untuk membangunkan semua utas menunggu, tetapi utas mana yang hendak dibangkitkan bergantung pada penjadual utas.

2. Langkah menggunakan tunggu dan beritahu dengan betul

Untuk menggunakan tunggu dan beritahu dengan betul, anda perlu mengikuti langkah berikut:

  1. Kunci: Apabila menggunakan tunggu dan beritahu, anda mesti mendapatkan kunci objek terlebih dahulu. Anda boleh menggunakan kata kunci yang disegerakkan untuk mengunci, atau menggunakan objek Kunci untuk mengunci.
  2. Panggil kaedah tunggu: Sebelum memasuki bahagian kritikal, panggil kaedah tunggu objek kunci untuk meletakkan benang semasa ke dalam keadaan menunggu.
  3. Penghakiman bersyarat: Sebelum memasuki bahagian kritikal, syarat sumber yang dikongsi hendaklah disemak terlebih dahulu. Sekiranya syarat tidak dipenuhi, anda harus terus menunggu sehingga syarat dipenuhi.
  4. Lepaskan kunci: Selepas memanggil kaedah tunggu, utas semasa akan melepaskan kunci objek, membenarkan utas lain memasuki bahagian kritikal untuk mengendalikan sumber kongsi.
  5. Call notify or notifyAll kaedah: Apabila syarat dipenuhi, anda boleh memanggil notify atau notifyAll kaedah objek kunci untuk membangunkan benang yang menunggu.
  6. Kunci semula: Benang yang dibangkitkan akan mendapatkan semula kunci objek dan terus bersaing untuk pelaksanaan.

3. Contoh kod khusus

Contoh kod berikut menunjukkan cara menggunakan tunggu dan pemberitahuan dengan betul untuk mencapai kerjasama antara dua urutan. Satu utas bertanggungjawab untuk menunggu untuk dikejutkan, dan satu lagi benang bertanggungjawab untuk bangun.

public class WaitNotifyExample {
    private static final Object lock = new Object();
    private static boolean isReady = false;

    public static void main(String[] args) {
        Thread waitingThread = new Thread(() -> {
            synchronized (lock) {
                while (!isReady) {
                    try {
                        System.out.println("等待中...");
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("等待结束!");
            }
        });

        Thread notifyingThread = new Thread(() -> {
            synchronized (lock) {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("唤醒等待的线程...");
                isReady = true;
                lock.notify();
            }
        });

        waitingThread.start();
        notifyingThread.start();
    }
}

Jalankan kod di atas dan anda dapat melihat bahawa benang menunggu akan memasuki keadaan menunggu dan meneruskan pelaksanaan selepas dikejutkan.

Dalam contoh ini, kami menggunakan pembolehubah boolean kongsi isReady untuk mewakili keadaan menunggu. Benang menunggu akan menyemak adalahSedia sebelum memasuki bahagian kritikal Jika syarat tidak dipenuhi, kaedah tunggu akan dipanggil untuk memasuki keadaan menunggu. Selepas urutan bangun tidur memenuhi syarat, ia akan menukar nilai isReady dan memanggil kaedah pemberitahuan untuk membangunkan utas menunggu.

Perlu diingat bahawa apabila menggunakan tunggu dan beritahu, anda mesti memastikan bahawa benang memperoleh kunci objek yang sama. Jika tidak, benang tidak boleh memasuki keadaan menunggu dengan betul atau dibangunkan.

Ringkasan

Menggunakan kaedah tunggu dan maklumkan boleh mencapai kerjasama antara pelbagai rangkaian dan memastikan keselamatan dan kecekapan program. Apabila menggunakan kedua-dua kaedah ini, anda perlu mengikut langkah yang betul, termasuk mengunci, memanggil kaedah tunggu, menyemak keadaan, melepaskan kunci, memanggil kaedah pemberitahuan, dsb. Dengan menggunakan kaedah tunggu dan maklumkan secara rasional, kami boleh mengelakkan masalah berbilang benang dan meningkatkan kebolehpercayaan dan kebolehselenggaraan program.

Atas ialah kandungan terperinci Cara menggunakan kaedah objek tunggu dan beritahu dengan betul dalam 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