Bagaimana untuk melaksanakan masalah pengguna-pengguna di Java?
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.
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!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Stock Market GPT
Penyelidikan pelaburan dikuasakan AI untuk keputusan yang lebih bijak

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

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.

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.

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

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

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

Genericsinjavaprovidecompile-timetypesafetyandeliminatetheneedforcastingingbyallowinglasses, antara muka, danmethodstooperateonTypeparameters;

Toimplementacustompomparatorinjava, createAclassorldatoverridestHecompareMethodTodefinesortinglogic.forexample, withapersonclasshavingnameandageandields, defineageComparaterimplementingcomparatorandoverridecareageusease

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
