Java多线程技术~生产者和消费者问题

本文深入探讨Java多线程中的生产者消费者问题,通过线程通信解决资源同步。分析了wait(), wait(time), notify()和notifyAll()的使用,对比了它们与sleep()的区别。此外,介绍了Lock和Condition如何更精细化地控制线程间的协作,提供更安全高效的解决方案。" 110597316,10295736,近红外光谱结合CARS-PLS模型检测草莓可溶性固形物含量研究,"['光学检测', '食品检测', '近红外光谱技术', 'CARS算法', '水果品质']
摘要由CSDN通过智能技术生成

Java多线程技术~生产者和消费者问题

本文是上一篇文章的后续,详情点击该连接

线程通信

应用场景:生产者和消费者问题

       假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费

       如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止

       如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止

分析

       这是一个线程同步问题,生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件

       对于生产者,没有生产产品之前,要通知消费者等待。而生产了产品之后,又需要马上通知消费者消费

       对于消费者,在消费之后,要通知生产者已经消费结束,需要继续生产新产品以供消费

       在生产者消费者问题中,仅有synchronized是不够的

              synchronized可阻止并发更新同一个共享资源,实现了同步

              synchronized不能用来实现不同线程之间的消息传递(通信)

方法名 作用
final void wait() 表示线程一直等待,直到其它线程通知
void wait(long timeout) 线程等待指定毫秒参数的时间
final void wait(long timeout,int nanos) 线程等待指定毫秒、微妙的时间
final void notify() 唤醒一个处于等待状态的线程
final void notifyAll() 唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程优先运行

消费者,生产者线程代码实现

package com.alvin.test;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Test {
   
    public static void main(String[] args){
   
        //创建共享资源对象
        Shop shop = new Shop();
        //创建生产者
        Boss boss = new Boss(shop);
        //创建消费者
        Customer customer = new Customer(shop);
        //启动线程
        new Thread(boss).start();
        new Thread(customer).start();
    }
}

//生产者类
class Boss implements Runnable{
   
    private Shop shop;
    public Boss(Shop shop){
   
        this.shop = shop;
    }
    @Override
    public void run() {
   
        for(int i = 1; i < 100; i++){
   
            if(i % 2 == 0){
   
                shop.Set("OPPO","reno 3 Pro");
            }else{
   
                shop.Set("HUWEI","Mate 30 Pro");
            }
        }
    }
}

//消费者类
class Customer implements 
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值