java基础七---线程2 生产者和消费者方式一

第一步:先创建商品GoodsEntity 实体对象

/**
 * 商品实体类
 */

public class GoodsEntity {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

第二步:创建生产者线程

/**
 * 生产者线程
 */
public class ProducerThread implements Runnable{
    public  boolean isRuning=false;
    GoodsEntity goodsEntity =null;//商品实体对象
    int id=0; //商品id
    public ProducerThread(GoodsEntity goodsEntity){
        this.goodsEntity=goodsEntity;
    }
    @Override
    public void run() {
       while (isRuning){
           synchronized (goodsEntity) {
               //使用商品对象来同步代码
               try {
                    if(goodsEntity.getName()==null){
                        //name 为空说明已经消费完了需要生产商品
                        goodsEntity.setName("商品" + (++id));
                        Log.e("Thread_test_pro",Thread.currentThread().getName()+ " 生产商品:---" + goodsEntity.getName());
                        //商品生产完成,通知消费线程消费
                        goodsEntity.notifyAll();
                    }else {
                        //name  不为空说明商品还没有消费完,等待商品消费
                        goodsEntity.wait();
                    }
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
       }
    }
}

第三步:创建消费者线程

/**
 * 消费者线程
 */

public class ConsumerThread implements Runnable{
    public  boolean isRuning=false;
    private GoodsEntity goodsEntity=null;
    int count=0;
    public ConsumerThread(GoodsEntity goodsEntity){
        this.goodsEntity=goodsEntity;
    }
    @Override
    public void run() {
        while (isRuning){
            synchronized (goodsEntity) {
                try {
                    if(goodsEntity.getName()==null){
                         //商品为空,说明没有生产新的商品,等待生产
                         goodsEntity.wait();
                    }else{
                        Log.e("Thread_test_con", Thread.currentThread().getName()+ " 消费商品:" + goodsEntity.getName());
                        goodsEntity.setName(null);//清空商品
                        //商品消费完之后清空商品,通知生产
                        goodsEntity.notifyAll();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

第四步:测试

   public static void main(){
        GoodsEntity goodsEntity=new GoodsEntity();
        ProducerThread producerThread=new ProducerThread(goodsEntity);//生产者
        ConsumerThread consumerThread=new ConsumerThread(goodsEntity);//消费者
        producerThread.isRuning=true;
        consumerThread.isRuning=true;

        Thread proThrad1=new Thread(producerThread,"生产线程1");
        Thread proThrad2=new Thread(producerThread,"生产线程2");
        Thread proThrad3=new Thread(producerThread,"生产线程3");

        Thread conThrad1=new Thread(consumerThread,"消费线程1");
        Thread conThrad2=new Thread(consumerThread,"消费线程2");
        Thread conThrad3=new Thread(consumerThread,"消费线程3");

        proThrad1.start();
        proThrad2.start();
        proThrad3.start();

        conThrad1.start();
        conThrad2.start();
        conThrad3.start();
        try {
            Thread.sleep(6000);
            producerThread.isRuning=false;
            consumerThread.isRuning=false;
            Log.e("Thread_test", "proThrad1.isAlive()="+proThrad1.isAlive());
            Thread.sleep(2000);
            Log.e("Thread_test", "proThrad1.isAlive()2="+proThrad1.isAlive());
        } catch (InterruptedException e) {
            Log.e("Thread_test", "InterruptedException ex="+e.toString());
            e.printStackTrace();
        }
    }

备注:调用   goodsEntity.wait(); 之后将自动释放同步。

 

输出:

01-06 12:45:42.657 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品1
01-06 12:45:42.858 26348-26397/com.example.test3 E/Thread_test_con: 消费线程1 消费商品:商品1
01-06 12:45:42.959 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品2
01-06 12:45:42.959 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品2
01-06 12:45:43.060 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品3
01-06 12:45:43.061 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品3
01-06 12:45:43.162 26348-26396/com.example.test3 E/Thread_test_pro: 生产线程3 生产商品:---商品4
01-06 12:45:43.363 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品4
01-06 12:45:43.465 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品5
01-06 12:45:43.567 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品5
01-06 12:45:43.667 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品6
01-06 12:45:43.768 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品6
01-06 12:45:43.870 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品7
01-06 12:45:44.072 26348-26397/com.example.test3 E/Thread_test_con: 消费线程1 消费商品:商品7
01-06 12:45:44.174 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品8
01-06 12:45:44.376 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品8
01-06 12:45:44.482 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品9
01-06 12:45:44.684 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品9
01-06 12:45:44.785 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品10
01-06 12:45:44.886 26348-26397/com.example.test3 E/Thread_test_con: 消费线程1 消费商品:商品10
01-06 12:45:44.988 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品11
01-06 12:45:45.190 26348-26397/com.example.test3 E/Thread_test_con: 消费线程1 消费商品:商品11
01-06 12:45:45.291 26348-26396/com.example.test3 E/Thread_test_pro: 生产线程3 生产商品:---商品12
01-06 12:45:45.393 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品12
01-06 12:45:45.495 26348-26396/com.example.test3 E/Thread_test_pro: 生产线程3 生产商品:---商品13
01-06 12:45:45.696 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品13
01-06 12:45:45.798 26348-26396/com.example.test3 E/Thread_test_pro: 生产线程3 生产商品:---商品14
01-06 12:45:45.799 26348-26397/com.example.test3 E/Thread_test_con: 消费线程1 消费商品:商品14
01-06 12:45:45.900 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品15
01-06 12:45:46.103 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品15
01-06 12:45:46.204 26348-26396/com.example.test3 E/Thread_test_pro: 生产线程3 生产商品:---商品16
01-06 12:45:46.306 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品16
01-06 12:45:46.407 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品17
01-06 12:45:46.610 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品17
01-06 12:45:46.711 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品18
01-06 12:45:46.812 26348-26397/com.example.test3 E/Thread_test_con: 消费线程1 消费商品:商品18
01-06 12:45:46.913 26348-26396/com.example.test3 E/Thread_test_pro: 生产线程3 生产商品:---商品19
01-06 12:45:47.115 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品19
01-06 12:45:47.216 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品20
01-06 12:45:47.519 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品20
01-06 12:45:47.620 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品21
01-06 12:45:47.722 26348-26397/com.example.test3 E/Thread_test_con: 消费线程1 消费商品:商品21
01-06 12:45:47.823 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品22
01-06 12:45:47.924 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品22
01-06 12:45:48.026 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品23
01-06 12:45:48.228 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品23
01-06 12:45:48.329 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品24
01-06 12:45:48.330 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品24
01-06 12:45:48.431 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品25
01-06 12:45:48.533 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品25
01-06 12:45:48.559 26348-26348/com.example.test3 E/Thread_test: proThrad1.isAlive()=true
01-06 12:45:48.634 26348-26396/com.example.test3 E/Thread_test_pro: 生产线程3 生产商品:---商品26
01-06 12:45:50.560 26348-26348/com.example.test3 E/Thread_test: proThrad1.isAlive()2=true

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值