设为首页 加入收藏

TOP

java基础-多线程与并发(五)
2023-07-23 13:45:50 】 浏览:55
Tags:java 基础 程与并
间的通信问题

method 说明
wait() 表示线程一直等待,直到其他线程通知,与sleep不同,会释放锁
wait(long timeout) 指定等待的毫秒数
notify() 唤醒一个处于等待状态的线程
notifyAll() 唤醒同一个对象上所有调用wait()方法是线程,优先级别高的线程优先调度

注意:均是Object类的方法,都只能在同步方法或者同步代码块中使用,否则会抛出异常IIIegalMOnitorStateException

解决方式

并发协作模型“生产者/消费者模式”---->管程法

  • 生产者:负责生产数据的模块(可能是方法,对象,线程,进程);

  • 消费者:负责处理数据的模块(可能是方法,对象,线程,进程);

  • 缓冲区:消费者不能直接使用生产者的数据,他们之间有个“缓冲区”

生产者将生产好的数据放入缓冲区,消费者从缓冲区拿出数据

//测试:生产者消费者模型”---->利用缓冲区解决:管程法
//生产者,消费者,产品,缓冲区
public class TestPC{
    public static void main(String[] args){
        SynContainer container = new SynContainer();
        
        new Product(container).start();
        new Consumer(container).start();
    }
}
?
//生产者
class Productor extends Thread{
    SynContainer container;
    
    public Productor(SynContainer container){
        this.container = container;  
    }
}
?
//消费者
class Consumer extends Thread{
    SynContainer container;
    
    public Consumer(SynContainer container){
        this.container = container;
    }
    
    //消费
    public void run(){
        for(int i = 0;i<10;i++){
            System.out.println("消费了--->"+container.pop().id+"-"+"只鸡");
        }
    }
}
?
//产品
class Chicken{
    int id;//产品编号
    
    public Chicken(int id){
        this.id= id;
    }
    
}
?
//缓冲区
class SynContainer{
    
    //需要一个容器大小
    Chicken[] chickens = new Chicken[10];
    //容器计数器
    int count =0;
    
    //生产者放入产品
    public synchronized void push(Chicken chicken){
        //如果容器满了,就需要调度消费者消费
        if(count==chickens.length){
            //通知消费者消费,生产等待
            try{
                this.wait();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
        
        //如果没有满,我们就需要丢入产品
        chickens[count]=chicken;
        count++;
        
        //可以通知消费者消费了
        this.notifyAll();
        
    }
    
    //消费者消费产品
    public synchronized Chicken pop(){
        //判断能否消费
        if(count==0){
            //等待生产者生产,消费者等待
            try{
                this.wait();
            }catch(InterrupedException e){
                e.printStackTrace();
            }
        }
        
        //
首页 上一页 2 3 4 5 6 下一页 尾页 5/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇面试官:说说 String.intern() 和.. 下一篇阻塞队列详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目