前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Thread的wait和notify

Thread的wait和notify

作者头像
DH镔
发布2019-12-19 21:21:21
4020
发布2019-12-19 21:21:21
举报

Thread的wait和notify

当不同线程之间需要通信时,就要使用到wait和notify这两个方法

wait的作用

让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限。

nofity

唤醒等待队列中的某个线程,如果时多个线程同时等待并不能指定唤醒某个线程,这有CPU来决定

notifyAll

这个方法则是唤醒等待队列中的所有线程

实践

实现一个容器,提供get和size两个方法,些两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数大于5时,线程2给出提示并结束

代码

代码语言:javascript
复制
package cn.dhbin;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 实现一个容器,提供get和size两个方法,些两个线程,线程1添加10个元素到容器中,
 * 线程2实现监控元素的个数,当个数大于5时,线程2给出提示并结束
 * 使用Thread的wait和notify实现
 *
 * @author dhb
 */
public class Container1 {

    /**
     * 容器
     */
    private volatile List<Object> list = new ArrayList<>();


    public void add(Object obj) {
        list.add(obj);
    }

    public int size() {
        return list.size();
    }


    public static void main(String[] args) throws InterruptedException {
        Container1 c = new Container1();
        Object lock = new Object();

        /*
        * 监控大小的线程必须先执行,因为如果添加元素线程先执行的话,添加元素线程
        * 取到了锁并不释放,监控大小的线程就无法加入while块
        * */
        new Thread(() -> {
            synchronized (lock) {
                while (c.size() != 5) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("容器到达5个,结束");
                    // 唤醒添加元素线程
                    lock.notify();
                }
            }
        }).start();

        TimeUnit.SECONDS.sleep(1);

        new Thread(() -> {
            synchronized (lock) {
                for (int i = 0; i < 10; i++) {
                    c.add(new Object());
                    System.out.println(Thread.currentThread().getName() + "---" + i);
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (c.size() == 5) {
                        // 通知监控大小线程,notify并不会释放锁
                        lock.notify();
                        try {
                            // wait让出cpu,让监控大小线程执行
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }).start();

    }
}

资料

Java并发编程(一)Thread详解

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Thread的wait和notify
    • wait的作用
      • nofity
        • notifyAll
        • 实践
          • 代码
          • 资料
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档