Jadual Kandungan
1. Menggunakan tunggu () dan memberitahu () dengan kaedah yang disegerakkan
2. Menggunakan BlockingQueue (disyorkan)
Rumah Java javaTutorial Bagaimana untuk melaksanakan masalah pengguna-pengguna di Java?

Bagaimana untuk melaksanakan masalah pengguna-pengguna di Java?

Sep 16, 2025 am 05:06 AM
java Pengeluar dan pengguna

Gunakan tunggu () dan memberitahu () untuk melaksanakan masalah pengguna pengeluar: Kaedah yang disegerakkan digunakan untuk mengawal akses kepada penampan yang dikongsi. Pengeluar menunggu apabila penampan penuh, pengguna menunggu apabila penampan kosong, dan menggunakan memberitahu () untuk membangunkan benang yang sepadan. 2. Gunakan BlockingQueue dalam pakej java.util.concurrent untuk melaksanakan pertukaran data yang selamat dengan lebih mudah, mengelakkan pengurusan manual kunci dan menunggu bersyarat.

Bagaimana untuk melaksanakan masalah pengguna-pengguna di Java?

Masalah pengguna-pengguna adalah isu penyegerakan klasik dalam multithreading di mana satu atau lebih benang (pengeluar) menjana data dan memasukkannya ke dalam penampan bersama, manakala benang lain (pengguna) mengambil dan memproses data tersebut. Cabarannya terletak pada memastikan keselamatan benang apabila mengakses penampan bersama dan mengelakkan isu -isu seperti keadaan perlumbaan, kebuntuan, atau sibuk menunggu.

Di Java, ini dapat diselesaikan dengan cekap menggunakan tunggu () , memberitahu () , dan blok yang disegerakkan , atau lebih mudah dengan kelas dari pakej java.util.concurrent . Berikut adalah dua pelaksanaan praktikal.

1. Menggunakan tunggu () dan memberitahu () dengan kaedah yang disegerakkan

Pendekatan ini secara manual menguruskan koordinasi benang menggunakan kunci intrinsik.

// Kelas Buffer Dikongsi

 Kelas SharedBuffer {<br> buffer final int [] swasta;<br> indeks int swasta = 0;<br><br> public sharedbuffer (saiz int) {<br> this.buffer = new int [size];<br> }<br><br> Hasil kekosongan yang disegerakkan awam (nilai int) melemparkan Gangguan InterruptedException {<br> sementara (index == buffer.length) {<br> // buffer penuh - tunggu pengguna<br> tunggu ();<br> }<br> penampan [indeks] = nilai;<br> System.out.println ("dihasilkan:" nilai);<br> memberitahu (); // Beritahu pengguna menunggu<br> }<br><br> Penggunaan Int yang disegerakkan awam () melemparkan Gangguan Bergerak {<br> sementara (index == 0) {<br> // buffer kosong - tunggu pengeluar<br> tunggu ();<br> }<br> int value = buffer [-index];<br> System.out.println ("dimakan:" nilai);<br> memberitahu (); // Beritahu pengeluar menunggu<br> nilai pulangan;<br> }<br> }

// Thread Pengeluar

 Pengeluar kelas melaksanakan runnable {<br> buffer sharedbuffer akhir swasta;<br><br> pengeluar awam (buffer sharedbuffer) {<br> this.buffer = buffer;<br> }<br><br> @Override<br> public void run () {<br> Cuba {<br> untuk (int i = 1; i <= 10; i) {<br> buffer.produce (i);<br> Thread.sleep (100); // simulasi masa untuk menghasilkan<br> }<br> } tangkapan (InterruptedException e) {<br> Thread.currentthread (). Interrupt ();<br> }<br> }<br> }

// benang pengguna

 Kelas Pengguna Kelas Runnable {<br> buffer sharedbuffer akhir swasta;<br><br> Pengguna awam (buffer sharedbuffer) {<br> this.buffer = buffer;<br> }<br><br> @Override<br> public void run () {<br> Cuba {<br> untuk (int i = 1; i <= 10; i) {<br> buffer.consume ();<br> Thread.Sleep (200); // simulasi masa untuk dimakan<br> }<br> } tangkapan (InterruptedException e) {<br> Thread.currentthread (). Interrupt ();<br> }<br> }<br> }

// kelas utama untuk memulakan utas

 Kelas awam ProducerConsumerExample {<br> public static void main (string [] args) {<br> SharedBuffer Buffer = New SheetBuffer (5);<br><br> Thread producertHread = thread baru (pengeluar baru (penampan), "pengeluar");<br> Thread consumerthread = thread baru (pengguna baru (penampan), "pengguna");<br><br> producerthread.start ();<br> consumerthread.start ();<br> }<br> }

2. Menggunakan BlockingQueue (disyorkan)

Cara yang lebih mudah dan lebih selamat adalah menggunakan BlockingQueue dari java.util.concurrent, yang mengendalikan penyegerakan secara dalaman.

 import java.util.concurrent.blockingqueue;<br> import java.util.concurrent.linkedblockingqueue;<br><br> kelas safeBuffer {<br> Swasta akhir Swasta <teger> giliran;<br><br> SafeBuffer awam (kapasiti int) {<br> this.queue = New LinkedBlockingQueue <> (kapasiti);<br> }<br><br> Public Void Produce (Int Value) melemparkan Gangguan InterruptedException {<br> giliran.put (nilai); // Menunggu secara automatik jika penuh<br> System.out.println ("dihasilkan:" nilai);<br> }<br><br> Penggunaan Int Awam () melemparkan Gangguan TerrectedException {<br> int value = queue.take (); // Menunggu secara automatik jika kosong<br> System.out.println ("dimakan:" nilai);<br> nilai pulangan;<br> }<br> }

Kelas pengeluar dan pengguna yang sepadan akan menggunakan safeBuffer sebaliknya, dan kaedah utama tetap sama. Versi ini mengelakkan pengurusan kunci manual dan mengurangkan risiko ralat.

Menggunakan BlockingQueue biasanya disukai kerana ia lebih bersih, kurang rawan ralat, dan menawarkan ciri-ciri tambahan seperti tamat masa ( tawaran () , pungutan () dengan tamat masa).

Pada dasarnya hanya memilih pendekatan berdasarkan keperluan anda: kawalan peringkat rendah dengan tunggu/memberitahu, atau kesederhanaan dan kebolehpercayaan dengan menyekat.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan masalah pengguna-pengguna 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

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.

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 untuk membuat pelbagai dimensi di Java? Bagaimana untuk membuat pelbagai dimensi di Java? Sep 25, 2025 am 05:37 AM

Atwo-dimensialarrayinjavaisanarrayofarrays, declaredwithtwobrackets, likeint [] [] matriks, andcanbeinitializedwithvaluesorusingnew;

Bagaimana untuk mendapatkan direktori kerja semasa di Java? Bagaimana untuk mendapatkan direktori kerja semasa di Java? Sep 26, 2025 am 05:51 AM

ThecurrentworkingDirectoryInjavacanBeobtainTusingsystem.getProperty ("user.dir"), yang mana -mana yang tidak dapat dilancarkan

Apakah kelas singleton di Java? Apakah kelas singleton di Java? Sep 25, 2025 am 05:30 AM

AsingletonclassinjavaensureSonLyoneInstanceExisThoughoutApplication'sLifecycleBerbyUsingAprivateConstructor, aprivatestaticInstance, andApublicStaticGetInstance () Kaedah; CommonEmplementationseCludeeagerinitization, Lazyinitialization, Thread-Safelaz

Apakah konsep generik di Java? Apakah konsep generik di Java? Sep 26, 2025 am 05:19 AM

Genericsinjavaprovidecompile-timetypesafetyandeliminatetheneedforcastingingbyallowinglasses, antara muka, danmethodstooperateonTypeparameters;

Bagaimana untuk melaksanakan komparator tersuai di Java? Bagaimana untuk melaksanakan komparator tersuai di Java? Sep 25, 2025 am 05:09 AM

Toimplementacustompomparatorinjava, createAclassorldatoverridestHecompareMethodTodefinesortinglogic.forexample, withapersonclasshavingnameandageandields, defineageComparaterimplementingcomparatorandoverridecareageusease

Bagaimana Mengatasi Pengecualian Menggunakan Try-Catch di Java? Bagaimana Mengatasi Pengecualian Menggunakan Try-Catch di Java? Sep 25, 2025 am 06:43 AM

Menggunakan blok cuba menghalang kemalangan program dan mengendalikan pengecualian dengan anggun. Letakkan kod ralat yang mungkin ke dalam blok cuba dan dapatkan pengecualian khusus dengan tangkapan, seperti ArithmeteXception atau ArrayIndexOutOfBoundSexception. Blok tangkapan berganda boleh digunakan untuk mengendalikan pengecualian yang berbeza mengikut urutan untuk memastikan bahawa pengecualian khusus lebih disukai. Akhirnya blok digunakan untuk melakukan operasi pembersihan, yang akan berjalan tanpa mengira sama ada pengecualian berlaku, dan sesuai untuk membebaskan sumber. Bagi sumber yang melaksanakan autoklosable, disarankan untuk menggunakan sintaks yang cuba-dengan-resources, yang secara automatik dapat menutup sumber dan mengelakkan kebocoran. Penggunaan rasional mekanisme ini dapat meningkatkan kestabilan program dan

See all articles