美文网首页Java
Java16-5 多线程等待唤醒机制

Java16-5 多线程等待唤醒机制

作者: 第二套广播体操 | 来源:发表于2018-11-11 21:40 被阅读0次

多线程间的通信

多个线程处理同一个资源,但是处理的任务却不同
生产者 消费者实例
通过同步,解决没生产就消费的问题
但是出现了连续的生产没有消费的情况,和需求一个,消费一个的情况不符
使用等待唤醒机制
wait();
notify();
notifyAll();


//描述资源
class Bread{
    private String name;
    private int count=0;
    private boolean flog;//默认为false
    public Bread(String name) {
        this.name = name;
    }
    //生产方法
    public synchronized void produce(){
        if(flog) {//如果为true有面包储存 则会进入wait等待因为默认为false则结果为
            //false所以进入else
            try {
            wait();
            }
        catch (InterruptedException e){}
        }
        else {//生产面包
            count++;
        System.out.println(Thread.currentThread().getName()+"生产"+name+"数量"+count);
        flog=true;//将面包改为有存货
        notify();//激活窗口2线程
        }
    }
    //销售方法
    public synchronized void sale(){
        if (!flog){//如果没有储存的面包则结果为true进入wait等待

            try {
                wait();
            }catch (InterruptedException e){}
        }
        else//如果为else则会售出这个面包
        {
            System.out.println(Thread.currentThread().getName()+"销售"+name+"数量"+count);

        flog=false;//将库存改为没有
        notify();//激活窗口1线程
        }
    }
}
//生产窗口
class Producer implements Runnable{
    private Bread bread;
//从外界引入同一对象
    public Producer(Bread bread) {
        this.bread = bread;
    }

    @Override
    public void run() {
            for (int i = 0; i < 20; i++) {
                bread.produce();
            }
    }
}
//销售窗口
class ConSumer implements Runnable{
    private Bread bread;
//从外界引入同一对象
    public ConSumer(Bread bread) {
        this.bread = bread;
    }

    @Override
    public void run() {
            for (int j = 0; j < 20; j++) {
                bread.sale();
            }
    }
}

public class Producer_ConSumerDemo {
    public static void main(String[] args) {
          Bread bread=new Bread("面包");
          Producer producer=new Producer(bread);
          ConSumer conSumer=new ConSumer(bread);
          Thread t1=new Thread(producer,"窗口1");
          Thread t2=new Thread(conSumer,"窗口2");
          t1.start();
          t2.start();
    }
}

相关文章

  • Java16-5 多线程等待唤醒机制

    多线程间的通信 多个线程处理同一个资源,但是处理的任务却不同生产者 消费者实例通过同步,解决没生产就消费的问题但是...

  • JavaSE第19篇:多线程下篇

    核心概述:本篇我们将继续学习Java中的多线程,其中有多线程的等待唤醒机制、Condition接口的使用、Java...

  • Java学习Day13

    今日学习内容总结 线程 等待唤醒机制 线程 多线程原理 多线程执行时,在栈内存中,其实每一个执行线程都有一片自己所...

  • Java学习笔记 23 - 线程之多线程安全、死锁、同步机制

    本文主要内容1、多线程安全问题2、等待唤醒机制 01线程安全 A:线程安全问题引发多线程并发访问同一个数据资源时,...

  • JUC中线程之间得通信

    使用synchronized实现线程间通信,线程间通信:1、生产者+消费者2、通知等待唤醒机制.多线程编程模板:1...

  • 线程间通信

    线程间通信 等待唤醒机制 等待唤醒机制就是用于解决线程间通信的问题的,使用到的3个方法的含义如下:wait():告...

  • 6.AQS(抽象同步帮助器)

    加锁的本质是什么?加锁的本质是为了在多线程情况下串行的访问临界资源。 一、JAVA中的等待唤醒机制 1.1 基于m...

  • Java 多线程 线程间通信-等待唤醒机制

    线程间通讯:其实就是多个线程在操作同一个资源,但是操作的动作不同。 wait();notify();notifyA...

  • Java基础6

    等待唤醒机制---->生产消费问题 /** * * @author Jinyan * */ class Resou...

  • java多线程学习小案例

    多线程的小练习 需求:实现一次修改一次输出 主要知识点:多线程,同步,等待和唤醒

网友评论

    本文标题:Java16-5 多线程等待唤醒机制

    本文链接:https://www.haomeiwen.com/subject/tsuffqtx.html