wait()、notify()、notifyAll()详解

通信:一个发送数据(将获取的数据存入数组再发送出去),一个获取数据(创建数组来接收,数组和发送方一样大);这时当发送数据方数组存满,又重新存入数据,第一次的数据就会被覆盖,而获取数据方还没有来的急将第一次存的数据取出来,就会造成数据丢失。
这时有一种解决方法就是,每次数组满了,就等待,直到对方获取完数据,再加载,这样避免数据覆盖造成的丢失;获取方也是,每次空时就等待,直到有数据,这样避免造成去重复的数据。
从上面分析,这样必须用到同步和它的方法 :wait()、notify()、notifyAll()
用法

public class NumRunble implements Runnable {

    int count = 0;

    int inpos = 0;
    int outpos = 0;
    int[] cells = new int[5];

    public void run() {

        while (true) {


            get();
        }


    }


    public synchronized void put(int num) {
        try {

            while (count == cells.length) {
                System.out.println("输入线程等待中");
                this.wait();

            }
            cells[inpos] = num;
            System.out.println("在cells[" + inpos + "]中放入数据---" + cells[inpos]);
            inpos++;
            if (inpos == cells.length) {
                inpos = 0;
            }
            count++;
            this.notify();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public synchronized void get() {
        try {
            while (count == 0) {
                System.out.println("获取线程等待中");
                this.wait();
            }
            int data = cells[outpos];
            System.out.println("在cells[" + outpos + "]中取出数据---" + data);
            cells[outpos] = 0;
            outpos++;
            if (outpos == cells.length) {
                outpos = 0;
            }
            count--;
            this.notify();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
    NumRunble numRunble = new NumRunble();

        Thread thread1 = new Thread(numRunble);
        thread1.start();

        //输入
       // numRunble.put(1);

        for (int i = 0 ; i<10;i++){

            numRunble.put(i);
        }

打印结果:
“C:\Program Files\Java\jdk1.8.0_261\bin\java.exe” “-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1\lib\idea_rt.jar=52675:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1\bin” -Dfile.encoding=UTF-8 -classpath “C:\Program Files\Java\jdk1.8.0_261\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\rt.jar;E:\server\JiaYou\target\classes” Hello
在cells[0]中放入数据—0
在cells[1]中放入数据—1
在cells[2]中放入数据—2
在cells[3]中放入数据—3
在cells[4]中放入数据—4
输入线程等待中
在cells[0]中取出数据—0
在cells[1]中取出数据—1
在cells[2]中取出数据—2
在cells[3]中取出数据—3
在cells[4]中取出数据—4
获取线程等待中
在cells[0]中放入数据—5
在cells[1]中放入数据—6
在cells[2]中放入数据—7
在cells[3]中放入数据—8
在cells[4]中放入数据—9
在cells[0]中取出数据—5
在cells[1]中取出数据—6
在cells[2]中取出数据—7
在cells[3]中取出数据—8
在cells[4]中取出数据—9
获取线程等待中

wait() : 线程进入等待,不往下执行
notify(): 释放等待状态,线程往下执行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值