淘先锋技术网

首页 1 2 3 4 5 6 7

Java中的生产者和消费者问题是一种典型的多线程同步问题,由于多个线程同时对某个共享资源进行读写操作,容易出现竞争现象,导致数据不一致的情况。为了解决这个问题,需要采用一定的同步机制,使得生产者和消费者之间能够协调合作,互不干扰。

//生产者线程
public class Producer implements Runnable {
private Queuequeue;
private int maxNum;
public Producer(Queuequeue, 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 Queuequeue;
public Consumer(Queuequeue) {
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) {
Queuequeue = 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机制来实现生产者和消费者之间的同步,其中生产者在队列满时等待,消费者在队列空时等待,等待时释放锁,被唤醒后重新获得锁进入可执行状态。这样能够确保生产者和消费者线程之间的协作,避免同一时刻对队列进行读写操作。