A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区


概述:生产者消费者问题是线程之间通信的经典问题,下面的代码通过wait()和notify()方法实现生产者消费者问题,希望与大家交流。
消费者代码:
  1. import java.util.ArrayList;

  2. public class Consumer implements Runnable {
  3.         // 定义一个资源变量
  4.         private ArrayList<Object> resources;

  5.         // 通过构造方法从外界获取资源对象
  6.         public Consumer(ArrayList<Object> resources) {
  7.                 super();
  8.                 this.resources = resources;
  9.         }

  10.         @Override
  11.         public void run() {
  12.                 // 用共享资源当做线程同步锁
  13.                 synchronized (resources) {

  14.                         while (true) {
  15.                                 // 如果有资源:集合中有元素
  16.                                 if (resources.size() != 0) {
  17.                                         // 消费资源
  18.                                         Object element = resources.remove(resources.size() - 1);
  19.                                         System.out.println(element + "has been consumed.");
  20.                                         // 唤醒生产者线程
  21.                                         resources.notify();
  22.                                 } else {
  23.                                         // 没有可消费的资源,等待生产者生产
  24.                                         try {
  25.                                                 resources.wait();
  26.                                         } catch (InterruptedException e) {
  27.                                                 e.printStackTrace();
  28.                                         }
  29.                                 }
  30.                         }
  31.                 }
  32.         }

  33. }
复制代码
生产者代码
  1. import java.util.ArrayList;

  2. public class Producer implements Runnable {
  3.         // 定义一个资源变量
  4.         private ArrayList<Object> resources;

  5.         // 通过构造方法从外界获取资源对象
  6.         public Producer(ArrayList<Object> resources) {
  7.                 super();
  8.                 this.resources = resources;
  9.         }

  10.         @Override
  11.         public void run() {

  12.                 while (true) {
  13.                         // 用共享资源当做线程同步锁
  14.                         synchronized (resources) {
  15.                                 // 如果没有资源:集合中没有元素
  16.                                 if (resources.size() == 0) {
  17.                                         // 生产资源:向集合中添加元素
  18.                                         resources.add("element-" + resources.size());
  19.                                         // 打印提示:新元素已经添加
  20.                                         System.out.println("New element has been produced.");
  21.                                         // 唤醒消费者线程消费已经生产的资源
  22.                                         resources.notify();
  23.                                 } else {
  24.                                         // 如果有资源,等待消费者消费
  25.                                         try {
  26.                                                 resources.wait();
  27.                                         } catch (InterruptedException e1) {
  28.                                                 e1.printStackTrace();
  29.                                         }
  30.                                 }
  31.                         }
  32.                 }
  33.         }
  34. }
复制代码
测试类代码
  1. import java.util.ArrayList;

  2. public class ThreadDemo {
  3.         public static void main(String[] args) {
  4.                 // 创建资源对象
  5.                 ArrayList<Object> resources = new ArrayList<Object>();
  6.                 // 创建生产者消费者对象
  7.                 Producer p = new Producer(resources);
  8.                 Consumer c = new Consumer(resources);
  9.                 // 创建生产者消费者线程
  10.                 Thread produce = new Thread(p, "producer");
  11.                 Thread consume = new Thread(c, "consumer");
  12.                 // 启动线程
  13.                 produce.start();
  14.                 consume.start();
  15.         }
  16. }
复制代码




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马