Jadual Kandungan
Pelaksanaan biasa:
Contoh: Menggunakan ArrayBlockingQueue
2. Membina barisan menyekat tersuai dari awal
Mata Utama:
Contoh: barisan menyekat tersuai tersuai
Contoh penggunaan
Nota Reka Bentuk Utama
Rumah Java javaTutorial Cara melaksanakan barisan menyekat di Java

Cara melaksanakan barisan menyekat di Java

Oct 01, 2025 am 02:57 AM
java menyekat barisan

Menggunakan antara muka BlockingQueue terbina dalam Java adalah cara yang disyorkan untuk melaksanakan barisan menyekat. Sebagai contoh, ArrayBlockingQueue menyediakan barisan selamat thread yang dibatasi berdasarkan tatasusunan; 2. Anda boleh membina giliran menyekat tersuai dari sifar melalui disegerakkan, tunggu () dan notifyAll () untuk memastikan bahawa kaedah meletakkan blok apabila giliran penuh, mengambil kaedah blok apabila giliran kosong, dan menggunakan gelung sementara untuk mengelakkan bangun palsu; 3. Pelaksanaan terbina dalam adalah benang selamat, prestasi yang sangat baik, dan menyokong operasi masa tamat. Ia harus diberi keutamaan untuk digunakan dalam persekitaran pengeluaran, dan pelaksanaan tersuai digunakan terutamanya untuk pembelajaran atau keperluan khas.

Cara melaksanakan barisan menyekat di Java

Melaksanakan giliran menyekat di Java melibatkan membuat giliran yang selamat thread yang menyekat ketika cuba menghilangkan dari barisan kosong atau enqueue ke dalam barisan penuh (jika dibatasi). Anda boleh membina satu dari awal dengan menggunakan penyegerakan peringkat rendah atau memanfaatkan utiliti konvensyen yang sedia ada. Inilah cara untuk melakukan kedua -duanya.


1. Menggunakan antara muka pemblokasan terbina dalam (disyorkan)

Java menyediakan antara muka java.util.concurrent.BlockingQueue dengan beberapa pelaksanaan siap sedia. Ini adalah cara standard dan paling selamat.

Pelaksanaan biasa:

  • ArrayBlockingQueue - Baris yang dibatasi berdasarkan array.
  • LinkedBlockingQueue - barisan pilihan yang dibatasi berdasarkan nod yang dipautkan.
  • PriorityBlockingQueue - Gilir keutamaan yang tidak terkawal.
  • SynchronousQueue - Pemindahan elemen secara langsung antara benang.

Contoh: Menggunakan ArrayBlockingQueue

 import java.util.concurrent.arrayblockingqueue;
import java.util.concurrent.blockingqueue;

Kelas awam ProducerConsumerExample {
    Int Final Static Int Owleon_Capacity = 5;
    swasta statik swasta <teger> barisan = arrayblockingqueue baru <> (queue_capacity);

    public static void main (string [] args) {
        Pengeluar Thread = thread baru (() -> {
            Cuba {
                untuk (int i = 0; i <10; i) {
                    giliran.put (i); // blok jika giliran penuh
                    System.out.println ("Dihasilkan:" i);
                    Thread.sleep (100);
                }
            } tangkapan (InterruptedException e) {
                Thread.currentthread (). Interrupt ();
            }
        });

        Pengguna Thread = thread baru (() -> {
            Cuba {
                sementara (benar) {
                    Nilai integer = giliran.take (); // blok jika giliran kosong
                    System.out.println ("dimakan:" nilai);
                    jika (nilai == 9) rehat; // Berhenti setelah memakan semua
                    Thread.Sleep (200);
                }
            } tangkapan (InterruptedException e) {
                Thread.currentthread (). Interrupt ();
            }
        });

        producer.start ();
        consumer.start ();
    }
}

Pendekatan ini selamat, cekap, dan mengendalikan menyekat secara automatik.


2. Membina barisan menyekat tersuai dari awal

Jika anda ingin memahami dalaman atau memerlukan tingkah laku tersuai, anda boleh melaksanakan satu menggunakan synchronized , wait() , dan notifyAll() .

Mata Utama:

  • Gunakan kaedah atau blok synchronized untuk pengecualian bersama.
  • Gunakan wait() untuk menyekat benang apabila barisan kosong (untuk mengambil) atau penuh (untuk diletakkan).
  • Gunakan notifyAll() untuk bangun benang menunggu apabila keadaan berubah.

Contoh: barisan menyekat tersuai tersuai

 import java.util.linkedList;
import java.util.queue;

kelas awam CustomBlockingQueue <T> {
    Peribadi Final Giliran <T> barisan = LinkedList baru <> ();
    kapasiti int akhir swasta;

    customblockingqueue awam (kapasiti int) {
        this.capacity = kapasiti;
    }

    PULIK PULIC STINCHRONIZED PUT (T item) Melemparkan Gangguan TerrectedException {
        manakala (giliran.size () == kapasiti) {
            tunggu (); // tunggu jika penuh
        }
        giliran.add (item);
        notifyAll (); // Beritahu pengguna menunggu
    }

    Take To Take () Public Sychronized () Throws InterruptedException {
        manakala (giliran.isempty ()) {
            tunggu (); // Tunggu jika kosong
        }
        T item = giliran.poll ();
        notifyAll (); // Beritahu pengeluar menunggu
        item pengembalian;
    }

    saiz int yang disegerakkan awam () {
        kembali giliran.size ();
    }
}

Contoh penggunaan

 kelas awam CustomBlockingQueuedemo {
    public static void main (string [] args) {
        CustomBlockingQueue <Integer> barisan = customBlockingQueue baru <> (3);

        Pengeluar Thread = thread baru (() -> {
            Cuba {
                untuk (int i = 0; i <5; i) {
                    giliran.put (i);
                    System.out.println ("Dihasilkan:" i);
                    Thread.sleep (100);
                }
            } tangkapan (InterruptedException e) {
                Thread.currentthread (). Interrupt ();
            }
        });

        Pengguna Thread = thread baru (() -> {
            Cuba {
                untuk (int i = 0; i <5; i) {
                    Nilai integer = giliran.take ();
                    System.out.println ("dimakan:" nilai);
                    Thread.Sleep (200);
                }
            } tangkapan (InterruptedException e) {
                Thread.currentthread (). Interrupt ();
            }
        });

        producer.start ();
        consumer.start ();
    }
}

Nota Reka Bentuk Utama

  • Gunakan while gelung dengan wait() : Sentiasa periksa keadaan dalam gelung untuk mengelakkan bangun palsu.
  • Call notifyAll() Daripada notify() : memastikan semua benang menunggu yang relevan mendapat peluang untuk meneruskan.
  • Keselamatan Thread : Semua akses kepada keadaan bersama mesti disegerakkan.
  • Bated vs Unbounded : Tentukan sama ada barisan anda harus mempunyai kapasiti tetap.

Menggunakan pelaksanaan BlockingQueue dari java.util.concurrent lebih disukai dalam pengeluaran. Rolling anda sendiri berguna untuk pembelajaran atau kes penggunaan yang sangat spesifik. Versi terbina dalam adalah diuji dengan baik, pelaku, dan masa tamat sokongan ( offer(e, timeout) , poll(timeout) ), yang lebih sukar untuk mendapatkan hak secara manual.

Pada asasnya, melainkan jika anda mempunyai sebab khas, pergi dengan ArrayBlockingQueue atau LinkedBlockingQueue .

Atas ialah kandungan terperinci Cara melaksanakan barisan menyekat di 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

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

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.

Stock Market GPT

Stock Market GPT

Penyelidikan pelaburan dikuasakan AI untuk keputusan yang lebih bijak

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)

Topik panas

Cara memaksa laman web skala oleh UC Browser_UC Browser's Skala Web Laman Web oleh Penyemak Imbas UC Cara memaksa laman web skala oleh UC Browser_UC Browser's Skala Web Laman Web oleh Penyemak Imbas UC Sep 24, 2025 pm 04:54 PM

Pertama, aktifkan fungsi skala terbina dalam penyemak imbas UC, pergi ke Tetapan → Layari Tetapan → Font dan Typesetting atau Page Scaling, dan pilih nisbah pratetap atau peratusan tersuai; Kedua, anda boleh memaksa saiz paparan halaman dengan membuka atau mencubit gerak isyarat dengan dua jari; Untuk laman web yang menyekat skala, anda boleh meminta versi desktop laman web untuk membuka kunci sekatan; Pengguna lanjutan juga boleh mengubah suai atribut Viewport dengan melaksanakan kod JavaScript di bar alamat untuk mencapai kesan skala paksa yang lebih fleksibel.

Mengapa sistem masa nyata memerlukan jaminan tindak balas deterministik? Mengapa sistem masa nyata memerlukan jaminan tindak balas deterministik? Sep 22, 2025 pm 04:03 PM

Sistem masa nyata memerlukan tindak balas deterministik, kerana ketepatan bergantung pada masa penghantaran hasil; Sistem masa nyata yang sukar memerlukan tarikh akhir yang ketat, terlepas akan membawa kepada bencana, sementara masa nyata yang lembut membolehkan kelewatan sekali-sekala; Faktor-faktor yang tidak ditentukan seperti penjadualan, gangguan, cache, pengurusan memori, dan lain-lain mempengaruhi masa; Pelan pembinaan termasuk pemilihan RTO, analisis WCET, pengurusan sumber, pengoptimuman perkakasan dan ujian yang ketat.

Bagaimana untuk mendapatkan nama kaedah panggilan di Java? Bagaimana untuk mendapatkan nama kaedah panggilan di Java? Sep 24, 2025 am 06:41 AM

Jawapannya ialah menggunakan thread.currentThread ().

Bagaimana anda menangani pengecualian di Java? Bagaimana anda menangani pengecualian di Java? Sep 23, 2025 am 04:44 AM

Pengendalian pengecualian Java menangkap pengecualian melalui blok cuba, akhirnya blok memastikan pembersihan sumber, cuba-dengan-sumber secara automatik menguruskan sumber, melemparkan pengecualian, pengecualian adat untuk menangani kesilapan tertentu, dan mengikuti amalan terbaik seperti menangkap pengecualian tertentu, tidak mengabaikan pengecualian, dan mengelakkan blok tangkapan kosong, dengan itu mencapai kod yang rapi dan mengekalkan.

Bagaimana menggunakan kelas pilihan untuk mengelakkan NullPointerException di Java? Bagaimana menggunakan kelas pilihan untuk mengelakkan NullPointerException di Java? Sep 25, 2025 am 06:04 AM

Kelas pilihan digunakan untuk mengendalikan nilai -nilai yang selamat yang mungkin menjadi batal, mengelakkan pengecualian penunjuk null. 1. Buat contoh menggunakan pilihan. Nullable untuk mengendalikan nilai null. 2. Semak dan nilai akses melalui ISPRESENT atau Keselamatan IFPRESENT untuk mengelakkan panggilan langsung untuk menyebabkan pengecualian. 3. Gunakan Orelse dan Orelseget untuk memberikan nilai lalai, atau gunakan Orelsethrow untuk membuang pengecualian tersuai. 4. Menukar atau menapis nilai melalui operasi peta dan penapis rantaian untuk meningkatkan kebolehbacaan kod dan ketahanan.

Penggunaan CPU Tinggi Microsoft Edge Penggunaan CPU Tinggi Microsoft Edge Sep 24, 2025 am 12:17 AM

Edge menduduki CPU yang tinggi kerana penggunaan sumber yang tinggi berdasarkan kernel kromium, ditambah dengan faktor-faktor seperti halaman multi-tab, plug-in berjalan, skrip laman web dan mekanisme rendering; Penyelesaian termasuk: 1. Tutup sambungan yang tidak perlu untuk mengurangkan beban latar belakang; 2. Dayakan fungsi "Tag Tidur" untuk mengurangkan penggunaan sumber tag terbiar; 3. Bersihkan proses latar belakang dan tutup tetapan yang berkaitan dengan GPU; 4. Kemas kini penyemak imbas dan sistem untuk memastikan keserasian dan pengoptimuman prestasi.

Bagaimana untuk mendapatkan kelas objek di Java? Bagaimana untuk mendapatkan kelas objek di Java? Sep 26, 2025 am 04:58 AM

Gunakan kaedah getClass () untuk mendapatkan kelas runtime objek, seperti str.getClass () untuk mengembalikan objek kelas; Untuk jenis, anda boleh menggunakan sintaks string.class secara langsung. Kelas kelas menyediakan kaedah seperti getName (), getImpleName () untuk mendapatkan maklumat kelas, seperti num.getClass (). GetImpleName () untuk output integer.

Bagaimana cara menggunakan kaedah ganti pada rentetan di Java? Bagaimana cara menggunakan kaedah ganti pada rentetan di Java? Sep 24, 2025 am 02:53 AM

DiaplacemethodinjavareturnsanewstringwithalloccurrencesofspecifiedCharactersorsorsreplaced.ithastwoforms: OneForReplacingsinglecharactersandanotherforsubstrings.sincestringsareimmutable, theoriginalremainsuncle, "

See all articles