下面是针对“Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解”的完整攻略。
什么是生产者消费者模式?
生产者消费者模式是指:生产者生产出来的任务放到一个仓库中,消费者从仓库中取出任务来消费。这样就将生产者和消费者融为一体,实现了解耦和。
生产者消费者模式需要解决的问题是:当仓库中的任务被消费完了,如何实现等待生产者生产新任务,同时也不影响已经在消费的消费者。
等待唤醒机制
在Java多线程中,使用wait()
、notify()
和notifyAll()
方法等待唤醒机制实现线程之间的通信。
wait()
方法的作用是:使当前线程进入等待状态,直到被唤醒。
notify()
方法和notifyAll()
方法的作用是:唤醒一个或多个等待的线程。
生产者消费者模式代码示例
下面是一个Java多线程之生产者消费者模式的代码示例。
任务类Task
public class Task {
private int value;
public Task(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
仓库类Storage
import java.util.LinkedList;
public class Storage {
private final int MAX_SIZE = 5;
private LinkedList<Task> tasks = new LinkedList<>();
public synchronized void put(Task task) {
while (tasks.size() == MAX_SIZE) {
try {
System.out.println("仓库已满,生产者" + Thread.currentThread().getName() + "进入等待状态");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("生产者" + Thread.currentThread().getName() + "生产了" + task.getValue() + "号商品");
tasks.add(task);
notifyAll();
}
public synchronized Task get() {
while (tasks.size() == 0) {
try {
System.out.println("仓库为空,消费者" + Thread.currentThread().getName() + "进入等待状态");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Task task = tasks.removeFirst();
System.out.println("消费者" + Thread.currentThread().getName() + "消费了" + task.getValue() + "号商品");
notifyAll();
return task;
}
}
生产者Producer类
public class Producer implements Runnable {
private Storage storage;
public Producer(Storage storage) {
this.storage = storage;
}
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
Task task = new Task(i);
storage.put(task);
}
}
}
消费者Consumer类
public class Consumer implements Runnable {
private Storage storage;
public Consumer(Storage storage) {
this.storage = storage;
}
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
Task task = storage.get();
}
}
}
测试类Test
public class Test {
public static void main(String[] args) {
Storage storage = new Storage();
Producer producer1 = new Producer(storage);
Producer producer2 = new Producer(storage);
Consumer consumer1 = new Consumer(storage);
Consumer consumer2 = new Consumer(storage);
new Thread(producer1, "生产者1").start();
new Thread(producer2, "生产者2").start();
new Thread(consumer1, "消费者1").start();
new Thread(consumer2, "消费者2").start();
}
}
在上述代码示例中,Storage
类是仓库类,Producer
类是生产者类,Consumer
类是消费者类,Task
类是任务类,Test
类是用于测试的主类。
运行测试类,输出内容如下:
仓库已满,生产者生产者1进入等待状态
生产者生产者2生产了1号商品
生产者生产者2生产了2号商品
生产者生产者1生产了3号商品
生产者生产者2生产了4号商品
生产者生产者1生产了5号商品
生产者生产者2进入等待状态
消费者消费者2消费了1号商品
消费者消费者1消费了2号商品
生产者生产者1生产了6号商品
生产者生产者2生产了7号商品
生产者生产者1生产了8号商品
生产者生产者2进入等待状态
消费者消费者1消费了3号商品
消费者消费者2消费了4号商品
生产者生产者1生产了9号商品
生产者生产者2生产了10号商品
仓库为空,消费者消费者2进入等待状态
消费者消费者1消费了5号商品
生产者生产者2生产了6号商品
生产者生产者1生产了7号商品
生产者生产者2生产了8号商品
生产者生产者1生产了9号商品
生产者生产者2进入等待状态
消费者消费者1消费了6号商品
消费者消费者2消费了7号商品
生产者生产者1生产了8号商品
生产者生产者2生产了9号商品
生产者生产者1生产了10号商品
消费者消费者2消费了8号商品
消费者消费者1消费了9号商品
消费者消费者2消费了10号商品
从输出内容中可以看出,生产者和消费者之间通过仓库进行线程通信,生产者不停地生产商品并放入仓库中,当仓库满时生产者进入等待状态,等待消费者消费商品后被唤醒;消费者不停地从仓库中取出商品并消费,当仓库为空时消费者进入等待状态,等待生产者生产商品后被唤醒。
以上是Java多线程之生产者消费者模式及等待唤醒机制代码详解,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解 - Python技术站