Java中的生产者和消费者问题是一种典型的多线程同步问题,由于多个线程同时对某个共享资源进行读写操作,容易出现竞争现象,导致数据不一致的情况。为了解决这个问题,需要采用一定的同步机制,使得生产者和消费者之间能够协调合作,互不干扰。
//生产者线程 public class Producer implements Runnable { private Queuequeue; private int maxNum; public Producer(Queue queue, int maxNum) { this.queue = queue; this.maxNum = maxNum; } @Override public void run() { int i = 0; while (true) { synchronized (queue) { while (queue.size() == maxNum) { try { System.out.println("队列满,等待消费..."); queue.wait();//释放锁并等待唤醒 } catch (InterruptedException e) { e.printStackTrace(); } } String message = "生产消息" + i; queue.add(message); System.out.println("生产者生产消息: " + message); queue.notifyAll();//唤醒所有等待的线程 i++; } } } } //消费者线程 public class Consumer implements Runnable { private Queue queue; public Consumer(Queue queue) { this.queue = queue; } @Override public void run() { while (true) { synchronized (queue) { while (queue.isEmpty()) { try { System.out.println("队列空,等待生产..."); queue.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } String message = queue.poll(); System.out.println("消费者消费消息: " + message); queue.notifyAll(); } } } } //主函数 public class Main { public static void main(String[] args) { Queue queue = new LinkedList<>(); int maxNum = 10; Thread producerThread = new Thread(new Producer(queue, maxNum)); Thread consumerThread = new Thread(new Consumer(queue)); producerThread.start(); consumerThread.start(); } }
以上代码使用了synchronized和wait/notifyAll机制来实现生产者和消费者之间的同步,其中生产者在队列满时等待,消费者在队列空时等待,等待时释放锁,被唤醒后重新获得锁进入可执行状态。这样能够确保生产者和消费者线程之间的协作,避免同一时刻对队列进行读写操作。