Sebelum menyelami penyelesaian, mari kita pecahkan konsep teras.
Masalah Pengeluar-Pengguna ialah tentang mengurus sumber yang dikongsi (penampan) antara dua jenis proses. Pengeluar menambah item pada penimbal, manakala pengguna mengalih keluar item. Penyegerakan yang betul adalah penting untuk mengelakkan isu seperti limpahan penimbal atau aliran bawah.
Menyelesaikan masalah Pengeluar-Pengguna dengan cekap adalah penting untuk aplikasi yang melibatkan tugas seperti pemprosesan data, rangkaian dan operasi berbilang benang. Pengendalian yang betul memastikan operasi yang lancar dan boleh dipercayai tanpa pembaziran sumber atau perbalahan.
Java menyediakan beberapa mekanisme untuk menangani masalah Pengeluar-Pengguna, masing-masing mempunyai kelebihan dan senario tersendiri untuk digunakan.
Kaedah Java wait() dan notify() ialah alat tradisional untuk mengurus penyegerakan. Begini cara anda boleh menggunakannya:
Kelas Pengeluar
import java.util.LinkedList; public class Producer implements Runnable { private final LinkedList<Integer> buffer; private final int BUFFER_SIZE; public Producer(LinkedList<Integer> buffer, int size) { this.buffer = buffer; this.BUFFER_SIZE = size; } @Override public void run() { try { while (true) { synchronized (buffer) { while (buffer.size() == BUFFER_SIZE) { buffer.wait(); } int item = produceItem(); buffer.add(item); System.out.println("Produced: " + item); buffer.notifyAll(); } Thread.sleep(1000); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } private int produceItem() { return (int) (Math.random() * 100); } }
Kelas Pengguna
import java.util.LinkedList; public class Consumer implements Runnable { private final LinkedList<Integer> buffer; public Consumer(LinkedList<Integer> buffer) { this.buffer = buffer; } @Override public void run() { try { while (true) { synchronized (buffer) { while (buffer.isEmpty()) { buffer.wait(); } int item = buffer.removeFirst(); System.out.println("Consumed: " + item); buffer.notifyAll(); } Thread.sleep(1000); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }
Kelas Utama
import java.util.LinkedList; public class Main { public static void main(String[] args) { LinkedList<Integer> buffer = new LinkedList<>(); int bufferSize = 10; Producer producer = new Producer(buffer, bufferSize); Consumer consumer = new Consumer(buffer); new Thread(producer).start(); new Thread(consumer).start(); } }
Keputusan Demo
Dalam persediaan ini, pengeluar dan pengguna beroperasi pada penimbal dikongsi. Pengeluar akan menambah item pada penimbal sementara pengguna mengeluarkannya. Saiz penimbal dikawal untuk mengelakkan limpahan dan aliran bawah, memastikan operasi lancar.
Java BlockingQueue menyediakan penyelesaian yang lebih mantap dengan mengendalikan penyegerakan secara dalaman.
Kelas Pengeluar
import java.util.concurrent.BlockingQueue; public class Producer implements Runnable { private final BlockingQueue<Integer> queue; public Producer(BlockingQueue<Integer> queue) { this.queue = queue; } @Override public void run() { try { while (true) { int item = produceItem(); queue.put(item); System.out.println("Produced: " + item); Thread.sleep(1000); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } private int produceItem() { return (int) (Math.random() * 100); } }
Kelas Pengguna
import java.util.concurrent.BlockingQueue; public class Consumer implements Runnable { private final BlockingQueue<Integer> queue; public Consumer(BlockingQueue<Integer> queue) { this.queue = queue; } @Override public void run() { try { while (true) { int item = queue.take(); System.out.println("Consumed: " + item); Thread.sleep(1000); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }
Kelas Utama
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class Main { public static void main(String[] args) { BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10); Producer producer = new Producer(queue); Consumer consumer = new Consumer(queue); new Thread(producer).start(); new Thread(consumer).start(); } }
Dalam pendekatan ini, BlockingQueue mengendalikan saiz penimbal dan penyegerakan secara automatik. Pengeluar dan pengguna berinteraksi dengan baris gilir tanpa memerlukan penyegerakan yang jelas.
Memahami dan menyelesaikan masalah Pengeluar-Pengguna adalah penting untuk pengaturcaraan berbilang benang yang berkesan. Java menyediakan pelbagai alatan, daripada penyegerakan manual dengan wait() dan notify(), kepada BlockingQueue yang lebih diperkemas. Pilih kaedah yang paling sesuai dengan keperluan aplikasi anda.
Jika anda mempunyai sebarang pertanyaan atau memerlukan penjelasan lanjut, sila tinggalkan komen di bawah!
Baca siaran lebih lanjut di : Kaedah untuk Menyelesaikan Masalah Pengeluar-Pengguna di Jawa
Atas ialah kandungan terperinci Kaedah untuk Menyelesaikan Masalah Pengeluar-Pengguna di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!