文档章节

通过一个例子,描述线程wait和notify方法

字数 675
阅读 27
收藏 0

场景:一个类中,一个是往容器中添加元素的方法,一个是返回容器大小的方法,现在又两个线程,A线程调用添加方法,B线程调用返回容器大小方法,当大小为5的时候,B线程提示并结束。

代码可直接复制,运行:

public class UseWaitAndNotify {
    volatile List list = new ArrayList();//这里为什么使用volatile,请看:https://my.oschina.net/u/4049911/blog/3121294  
    public void add(Object o) {
        list.add(o);
    }
    public int size() {
        return list.size();
    }
    public void useWaitAndNotify() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (this) {
                    System.out.println("size方法开始");
                    /**
                     * 这里必须得是不等于5,因为刚开始肯定不等于5,然后才会进这个方法,执行wait方法,这个线程就会在wait那等着。
                     * 然后cpu执行另一个方法,当另一个方法执行等于5是,使用notify唤醒等待的线程(等待同一个锁的线程)。
                     * 然后从wait方法开始往下执行,到结束。
                     */
                    if(list.size()!=5) {
                        try {
                            wait();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    System.out.println("size方法结束");
                }
            }
        }).start();
        synchronized (this) {
            System.out.println("add方法开始");
            for(int i=0;i<10;i++) {
                /**
                 *当加入元素==5时,当前线程就应该停止,让出cpu,让cpu去执行其他线程。
                 *那让线程让出cpu的方法有哪些呢:
                 *wait让出线程,释放锁
                 *yield 让出cpu,但不会释放锁
                 *join 插入其他线程,线程同步作用,在被调用线程未结束前,当前线程将一直阻塞在join处
                 *
                 *我们使用wait
                 *
                 */
                list.add(new Object());
                if(i==4) {
                    /**
                     * 这里为什么使用notify后,又使用wait呢,就是上面这个方法的意思,使用notify,当前线程是不会释放锁的,所以即使唤醒了其他
                     * 线程,其他线程拿不到锁,也执行不了。
                     * 也就是说如果下面不使用wait,当list等于5的时候,另一个线程拿不到锁,执行不了,只有当前线程释放锁,另一个线程才会拿到锁执行,
                     * 也就是说当list的size等于10的时候,另一个线程才会停止
                     */
                    this.notify();
                    try {
                        this.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                System.out.println("add方法结束");
            }
        }
    }

    @Test
    public void test() {  
        //使用wait和notify实现  
        useWaitAndNotify();  
    }  
}

因为wait和notify只能在锁中使用,所以需要加上synchronized锁

© 著作权归作者所有

粉丝 0
博文 16
码字总数 25998
作品 0
通州
私信 提问
JAVA多线程11-基础篇-线程间通讯wait,notify

本章介绍 线程间的协作方式,主要包含wait(),notify(),notifyAll()方法的使用以及代码示例 一、等待/通知机制介绍 在多线程环境下,为了保证线程安全,我们使用同步锁来保证任何时刻只有一...

x_coder
2017/11/14
0
0
Java Queue协作同步机制

  在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期...

IamOkay
2016/08/11
218
0
Java多线程 -- wait() 和 notify() 使用入门

在前面讲解synchronize的文章中,有提到wait和notify,大概描述了它的使用,这里我将根据官方api详细的教你如何使用。 所属对象 wait,notify,notifyAll 是定义在Object类的实例方法,用于控...

FantJ
2018/06/24
0
0
Thread->sleep、wait、join使用

Thread sleep、wait、join使用 这里先介绍join,然后把两个有关联的sleep和wait一起介绍. join() 这个方法比较好理解,当前线程等待指定线程终止后在执行,将两个交替执行的线程合并为顺序执行的...

zly921112
2017/05/04
0
0
再谈notify和notifyAll的区别和相同

经常在往上逛,关于在java中notify和notifyAll,经常有人有以下的说法: 1 notify只会通知一个在等待的对象,而notifyAll会通知所有在等待的对象,并且所有对象都会继续运行 并且,好像都有例...

Hosee
2015/07/21
275
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx主备模式笔记

(1)两台服务器 192.168.17.129 和 192.168.17.131 (2)在两台服务器安装 keepalived 安装 keepalived (1)使用 yum 命令进行安装 yum install keepalived –y (2)安装之后,在 etc 里面...

行者终成事
今天
4
0
004-Docker镜像

Docker镜像 一个通用的私有仓库,可以提升效率 Docker镜像构建分为两种,一种是手动构建,一种是Dockerfile(自动构建) 基于centos镜像构建手动制作nginx镜像 docker run --name testdocker -...

伟大源于勇敢的开始
今天
5
0
OSChina 周一乱弹 —— 我就加班,不去世不休息

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :《For Forever》90后那些小鲜肉歌手中,好像只有花花的歌能吸引我,这小家伙对音乐的感觉真是天才一般!#今日歌曲推荐# 《For F...

小小编辑
今天
9
1
【领会要领】web前端-轻量级框架应用(jQuery基础)

作者 | Jeskson 来源 | 达达前端小酒馆 jquery的安装和语法,jquery的多种选择器,dom操作和jquery事件。 jQuery框架,简介,优势,安装,语法,jQuery选择器,id选择器,类选择器,标记选择...

达达前端小酒馆
今天
6
0
MySQL 常用命令

无须死记硬背,直接 copy 就好。 1. 查看目前 mysql 用户 select user,host,password from mysql.user; 2. 修改 root 密码(使用内置函数修改) set password for root@localhost=password('y......

HuaiAnGG
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部