生产者消费者问题-同步

一消费者线程

package com.cyb.syn;

import java.util.List;

public class Consume implements Runnable {
 private List container = null;
 private int count;
 public Consume(List lst) {
  this.container = lst;//
 }
 public void run() {
  while (true) {
   synchronized (container) {
    if (container.size() == 0) {//如过容器内部的物品数为0,则等待,直到生产者生产的物品数不为0。
     try {
      container.wait();// 放弃锁,让生产者执行
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
    try {
     Thread.sleep(1000);//等待1s
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    container.remove(0);//消费一个物品
    container.notify();//唤醒等待线程(生产者)的线程
    System.out.println("我吃了" + (++count) + "个");
   }
  }
 }
 /**
  * 这里的公共资源为content,不同的线程都是用的是这一个资源,构成同步问题。
  */

}

 

二 生产者线程

package com.cyb.syn;

import java.util.List;

public class Product implements Runnable {
 private List container = null;
 private int count;
 public Product(List lst) {
  this.container = lst;

 }
 public void run() {
  while (true) {
   synchronized (container) {
    if (container.size() > MultiThread.MAX) {//如果当前容器内生产的物品格式为最大值,则唤醒等待的线程(即消费者线程)
     try {

      container.wait();

     } catch (InterruptedException e) {

      e.printStackTrace();

     }

    }
    try {
     Thread.sleep(1000);//等待1s中继续生产
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    container.add(new Object());
    container.notify();//唤醒消费者线程
    System.out.println("我生产了" + (++count) + "个");

   }

  }

 }

}
三  测试生产者和消费者线程(消费者消费时,保证生产者生产有物品,否则等待消费者生产)

package com.cyb.syn;

import java.util.ArrayList;

import java.util.List;

public class MultiThread {

 private List<String> container = new ArrayList<String>();

 public final static int MAX = 3;

 public static void main(String args[]) {

  MultiThread m = new MultiThread();
  new Thread(new Consume(m.getContainer())).start();

  new Thread(new Product(m.getContainer())).start();

  //new Thread(new Consume(m.getContainer())).start();

  //new Thread(new Product(m.getContainer())).start();
  
 }

 public List getContainer() {
  
  return container;

 }

 public void setContainer(List container) {

  this.container = container;

 }

}

四  测试结果

我生产了1个
我生产了2个
我生产了3个
我吃了1个
我吃了2个
我生产了4个
我生产了5个
我生产了6个
我吃了3个
我吃了4个
我吃了5个
我吃了6个
我生产了7个
我生产了8个

...


我生产了1个
我吃了1个
我生产了2个
我吃了2个
我生产了3个
我生产了4个
我生产了5个
我生产了6个
我吃了3个
我生产了7个
我吃了4个
我吃了5个
我吃了6个
我吃了7个
我生产了8个我生产了1个
我吃了1个
我生产了2个
我吃了2个
我生产了3个
我生产了4个
我生产了5个
我生产了6个
我吃了3个
我生产了7个
我吃了4个
我吃了5个
我吃了6个
我吃了7个
我生产了8个我生产了1个
我吃了1个
我生产了2个
我吃了2个
我生产了3个
我生产了4个
我生产了5个
我生产了6个
我吃了3个
我生产了7个
我吃了4个
我吃了5个
我吃了6个
我吃了7个
我生产了8个我生产了1个
我吃了1个
我生产了2个
我吃了2个
我生产了3个
我生产了4个
我生产了5个
我生产了6个
我吃了3个
我生产了7个
我吃了4个
我吃了5个
我吃了6个
我吃了7个
我生产了8个

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值