概述:生产者消费者问题是线程之间通信的经典问题,下面的代码通过wait()和notify()方法实现生产者消费者问题,希望与大家交流。
消费者代码:
- import java.util.ArrayList;
- public class Consumer implements Runnable {
- // 定义一个资源变量
- private ArrayList<Object> resources;
- // 通过构造方法从外界获取资源对象
- public Consumer(ArrayList<Object> resources) {
- super();
- this.resources = resources;
- }
- @Override
- public void run() {
- // 用共享资源当做线程同步锁
- synchronized (resources) {
- while (true) {
- // 如果有资源:集合中有元素
- if (resources.size() != 0) {
- // 消费资源
- Object element = resources.remove(resources.size() - 1);
- System.out.println(element + "has been consumed.");
- // 唤醒生产者线程
- resources.notify();
- } else {
- // 没有可消费的资源,等待生产者生产
- try {
- resources.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
- }
复制代码 生产者代码
- import java.util.ArrayList;
- public class Producer implements Runnable {
- // 定义一个资源变量
- private ArrayList<Object> resources;
- // 通过构造方法从外界获取资源对象
- public Producer(ArrayList<Object> resources) {
- super();
- this.resources = resources;
- }
- @Override
- public void run() {
- while (true) {
- // 用共享资源当做线程同步锁
- synchronized (resources) {
- // 如果没有资源:集合中没有元素
- if (resources.size() == 0) {
- // 生产资源:向集合中添加元素
- resources.add("element-" + resources.size());
- // 打印提示:新元素已经添加
- System.out.println("New element has been produced.");
- // 唤醒消费者线程消费已经生产的资源
- resources.notify();
- } else {
- // 如果有资源,等待消费者消费
- try {
- resources.wait();
- } catch (InterruptedException e1) {
- e1.printStackTrace();
- }
- }
- }
- }
- }
- }
复制代码 测试类代码
- import java.util.ArrayList;
- public class ThreadDemo {
- public static void main(String[] args) {
- // 创建资源对象
- ArrayList<Object> resources = new ArrayList<Object>();
- // 创建生产者消费者对象
- Producer p = new Producer(resources);
- Consumer c = new Consumer(resources);
- // 创建生产者消费者线程
- Thread produce = new Thread(p, "producer");
- Thread consume = new Thread(c, "consumer");
- // 启动线程
- produce.start();
- consume.start();
- }
- }
复制代码
|
|