Antarmuka antrian berada pada tingkat yang sama dengan daftar dan set, dan keduanya mewarisi antarmuka koleksi. LinkedList mengimplementasikan antarmuka antrian. Antarmuka antrian mempersempit akses ke metode LinkedList (yaitu, jika jenis parameter dalam metode ini adalah antrian, ia hanya dapat mengakses metode yang ditentukan oleh antarmuka antrian, dan tidak dapat secara langsung mengakses metode non-kuesi dari LinkedList), sehingga hanya metode yang tepat yang dapat digunakan. BlockingQueue mewarisi antarmuka antrian.
Antrian adalah struktur data. Ini memiliki dua operasi dasar: menambahkan elemen di akhir antrian, dan menghapus elemen dari kepala antrian berarti bahwa antrian mengelola data dengan cara pertama yang pertama. Jika Anda mencoba menambahkan elemen ke antrian pemblokiran penuh atau menghapus metasektor dari antrian pemblokiran kosong, itu akan menyebabkan benang memblokir. Menghambat antrian adalah alat yang berguna saat bekerja sama dengan beberapa utas. Utas pekerja dapat secara teratur menyimpan hasil perantara dalam antrian pemblokiran sementara utas pekerja lain mengeluarkan hasil perantara dan memodifikasinya di masa depan. Antrian secara otomatis menyeimbangkan beban. Jika set utas pertama berjalan lebih lambat dari yang kedua, set utas kedua akan diblokir sambil menunggu hasilnya. Jika set utas pertama berjalan cepat, itu akan menunggu utas kedua diatur untuk mengejar ketinggalan. Tabel berikut menunjukkan operasi pemblokiran antrian di JDK1.5:
Tambahkan Tambahkan Metasearch Jika antriannya penuh, lempar pengecualian iiiegaislabeepeplian
Hapus Hapus dan kembalikan elemen di kepala antrian. Jika antriannya kosong, pengecualian Exception Nosuchelement dilemparkan.
Elemen mengembalikan elemen di kepala antrian. Jika antriannya kosong, pengecualian Exception Nosuchelement dilemparkan.
Tawarkan Tambahkan elemen dan returns true jika antriannya penuh, kembalikan false
Polling menghapus dan mengembalikan elemen di kepala antrian. Jika antriannya kosong, kembalikan nol.
Peek mengembalikan elemen di kepala antrian. Jika antriannya kosong, kembalikan nol
Letakkan tambahkan elemen jika antrian penuh, blokir
Ambil hapus dan kembalikan elemen di kepala antrian. Jika antriannya kosong, blok
Hapus, elemen, penawaran, jajak pendapat, dan mengintip sebenarnya milik antarmuka antrian.
Operasi yang memblokir antrian dapat dibagi menjadi tiga kategori berikut sesuai dengan tanggapan mereka: AAD, Removee, dan Operasi Elemen melemparkan pengecualian ketika Anda mencoba menambahkan elemen ke antrian penuh atau mendapatkan elemen dari antrian kosong. Tentu saja, dalam program multithreaded, antrian dapat menjadi penuh atau kosong kapan saja, jadi Anda mungkin ingin menggunakan metode penawaran, jajak pendapat, mengintip. Metode -metode ini hanya memberikan pesan kesalahan ketika tugas tidak dapat diselesaikan tanpa melempar pengecualian.
CATATAN: Kesalahan metode polling dan mengintip dan mengembalikan nol. Oleh karena itu, adalah ilegal untuk memasukkan nilai nol ke dalam antrian.
Ada juga varian metode penawaran dan jajak pendapat dengan batas waktu, misalnya, panggilan berikut:
Boolean Success = q.offer (x, 100, timeunit.milliseconds);
Coba masukkan elemen ke ekor antrian dalam 100 milidetik. Jika berhasil, segera kembalikan true; Kalau tidak, ketika batas waktu tercapai, kembalikan salah. Demikian pula, hubungi:
Head objek = q.poll (100, timeunit.milliseconds);
Jika elemen header antrian berhasil dihapus dalam 100 milidetik, elemen header segera dikembalikan; Kalau tidak, NULL dikembalikan ketika batas waktu tercapai.
Akhirnya, kami memiliki operasi pemblokiran dan ambil. Metode put blok saat antrian penuh, dan metode take blok ketika antrian kosong.
Paket Java.ulil.concurrent menyediakan 4 varian antrian pemblokiran. Secara default, kapasitas LinkedBlockingQueUe bukan batas atas (tidak akurat. Kapasitasnya adalah integer. Ini adalah antrian berdasarkan daftar tertaut, yang mengurutkan elemen oleh FIFO (pertama di First Out).
ArrayBlockingQueue perlu menentukan kapasitas selama konstruksi, dan Anda dapat memilih apakah diperlukan keadilan. Jika parameter yang adil ditetapkan benar, utas dengan waktu tunggu terpanjang akan diproses terlebih dahulu (pada kenyataannya, keadilan ini dicapai dengan mengatur reentrantlock ke true: yaitu, utas dengan waktu tunggu terpanjang akan beroperasi terlebih dahulu). Biasanya, keadilan dapat dikenakan biaya kinerja Anda dan hanya menggunakannya saat itu benar -benar diperlukan. Ini adalah antrian loop pemblokiran berbasis array yang mengurutkan elemen menurut prinsip FIFO (pertama di First Out).
PriorityBlockingQueue adalah antrian dengan prioritas, bukan antrian pertama di pertama. Elemen dihapus dalam urutan prioritas, dan antrian tidak memiliki batas atas (saya melihat kode sumber. Prioritasblockingqueue adalah pembungkus ulang prioritas, yang didasarkan pada heap data. OutofmemoryError karena sumber daya yang sudah habis), tetapi jika antriannya kosong, pengambilan operasi elemen akan diblokir, sehingga operasi pencariannya diblokir. Selain itu, elemen -elemen yang memasuki antrian harus memiliki kemampuan komparatif.
Akhirnya, Delayqueue (diimplementasikan berdasarkan Prioritas) adalah antrian pemblokiran yang tidak terikat yang menyimpan elemen yang tertunda, dan elemen hanya dapat diekstraksi ketika penundaan berakhir. Kepala antrian ini adalah elemen yang tertunda dengan waktu penyimpanan terpanjang setelah penundaan berakhir. Jika tidak ada penundaan yang berakhir, antrian tidak memiliki header dan jajak pendapat akan kembali nol. Ketika metode getDelay (timeunit.nanoseconds) dari suatu elemen mengembalikan nilai kurang dari atau sama dengan nol, kedaluwarsa terjadi dan jajak pendapat menghapus elemen. Antrian ini tidak mengizinkan elemen nol. Inilah antarmuka penundaan:
Kode Java
Antarmuka publik tertunda memperluas <Delayed> {long getDelay (TimeUnit Unit) yang sebanding; }Elemen yang menempatkan Delayqueue juga akan mengimplementasikan metode CompareTo, yang menggunakan ini untuk mengurutkan elemen.
Contoh berikut menunjukkan cara menggunakan antrian pemblokiran untuk mengontrol set utas. Program mencari semua file dalam satu direktori dan semua subdirektori, dan mencetak daftar file yang berisi kata kunci yang ditentukan. Seperti yang dapat dilihat dari contoh-contoh berikut, dua manfaat signifikan dari menggunakan antrian pemblokiran adalah: operasi multi-utas dari antrian umum tidak memerlukan sinkronisasi tambahan. Selain itu, antrian akan secara otomatis menyeimbangkan beban, yaitu, jika pemrosesan (kedua sisi produksi dan konsumsi) diproses dengan cepat, itu akan diblokir, sehingga mengurangi kesenjangan kecepatan pemrosesan antara kedua sisi. Berikut ini adalah implementasi spesifik:
Kode Java
Public Class BlockingQueueTest {public static void main (string [] args) {scanner in = new scanner (system.in); System.out.print ("Masukkan Direktori Basis (EG /usr/local/jdk5.0/src):"); Direktori String = in.nextline (); System.out.print ("Masukkan kata kunci (misalnya volatile):"); Kata kunci string = in.nextline (); final int file_queue_size = 10; // // memblokir ukuran antrian int ear search_threads = 100; // Jumlah kata kunci pencarian kata // antrian pemblokiran berdasarkan arrayblockingqueUeueBlockingqueue <file> antrian = arrayblockingqueue baru <file> (file_queue_size); // hanya memulai satu utas untuk mencari direktori FileEnumerationTask enumerator = new FileEnumerationTask (antrian, file baru (direktori)); utas baru (enumerator) .start (); // Mulai 100 utas untuk mencari kata kunci yang ditentukan dalam file untuk (int i = 1; i <= search_threads; i ++) utas baru (pencarian baru (antrian, kata kunci)). Start (); }} class FileEnumerationTask mengimplementasikan runnable {// objek Metafile bodoh ditempatkan di akhir antrian pemblokiran untuk menunjukkan bahwa file tersebut telah dilintasi file statis publik dummy = file baru (""); BlockingQueue Private <File> antrian; File Pribadi StartingDirectory; Public FileenumerationTask (BlockingQueue <FILE> QUEUE, File StartingDirectory) {this.queue = Queue; this.startingDirectory = startdirectory; } public void run () {coba {enumerate (startingDirectory); queue.put (dummy); // Jalankan di sini untuk menunjukkan bahwa file dalam direktori yang ditentukan telah dilalui} catch (InterruptedException e) {}} // Masukkan semua file di direktori yang ditentukan ke dalam antrian pemblokiran sebagai file public voidy. untuk (file file: file) {if (file.isdirectory ()) aligur (file); lain // Letakkan elemen di akhir antrian. Jika antrian penuh, blokir antrian.put (file); }}} class SearchTask mengimplementasikan runnable {private blockingqueue <file> antrian; kata kunci string pribadi; pencarian publik (blockingqueue <pangkai> antrian, kata kunci string) {this.queue = antrian; this.keyword = kata kunci; } public void run () {coba {boolean done = false; while (! Done) {// Ambil elemen pertama antrian. Jika antrian kosong, blok file file = queue.take (); if (file == fileenumerationTask.dummy) {// ambil dan masukkan sehingga utas lain akan berakhir dengan cepat saat membacanya antrian.put (file); selesai = benar; } lain pencarian (file); }} catch (ioException e) {E.PrintStackTrace (); } catch (InterruptedException e) {}} PUBLIK PUBLAN PUBLIK (File File) Melempar IoException {Scanner in = New Scanner (FileInputStream baru (file)); int linenumber = 0; while (in.hasnextline ()) {linenumber ++; String line = in.nextline (); if (line.contains (kata kunci)) system.out.printf ("%s:%d:%s%n", file.getPath (), linenumber, line); } in.close (); }} Tautan asli: http://www.cnblogs.com/end/archive/2012/10/25/2738493.html
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.