zoukankan      html  css  js  c++  java
  • 多线程通信的三大法器,你真的会用吗?

    wait, notify, notifyAll 是多线程之间通信最重要的 3 个方法,今天,栈长给大家普及一下它们的知识要点及应用实战。

    定义

    wait:让持有该对象锁的线程等待;

    notify: 唤醒任何一个持有该对象锁的线程;

    notify: 唤醒所有持有该对象锁的线程;

    它们 3 个的关系是,调用对象的 wait 方法使线程暂停运行,通过 notify/ notifyAll 方法唤醒调用 wait 暂时的线程。

    然而,它们并不是 Thread 类中的方法,而是 Object 类中的,为什么呢!? 因为每个对象都有监视锁,线程要操作某个对象当然是要获取某个对象的锁了,而不是线程的锁。

    如图所示,wait 带时间表示最大超时时间,过了时间还不唤醒就会自动唤醒线程重新竞争对象锁。

    几个重要的点

    1、调用对象的 wait, notify, notifyAll 方法需要拥有对象的监视器锁,即它们只能在同步方法(块)中使用;

    2、调用 wait 方法会使用线程暂停并让出 CPU 资源,同时释放持有的对象的锁;

    3、多线程使用 notify 容易发生死锁,一般使用 notifyAll;

    4、关于 wait 和 sleep 的详细区别请翻阅 《多线程 sleep 和 wait 的 5 个区别》这篇文章。

    实战

    /**
     * 微信公众号:Java技术栈
     */
    public static void main(String[] args) {
    	Object lock = new Object();
    	Thread t1 = new Thread(() -> {
    		synchronized (lock) {
    			for (int i = 0; i < 20; i++) {
    				System.out.print(i);
    				if (i == 10) {
    					try {
    						lock.wait();
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    		}
    	});
    
    	Thread t2 = new Thread(() -> {
    		synchronized (lock) {
    			try {
    				Thread.sleep(5000);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			System.out.print("Java技术栈");
    			lock.notifyAll();
    		}
    	});
    
    	t1.start();
    	t2.start();
    }
    

    上面的例子结合 wait/ notifyAll 来演示了它们的相互作用。

    线程 t1 首先输出 012345678910,5秒后继续输出 Java技术栈111213141516171819


    更多 Java 多线程技术文章请在Java技术栈微信公众号后台回复关键字:多线程。

    本文原创首发于微信公众号:Java技术栈(id:javastack),关注公众号在后台回复 “多线程” 可获取更多,转载请原样保留本信息。

  • 相关阅读:
    【Elasticsearch 技术分享】—— ES 常用名词及结构
    【Elasticsearch 技术分享】—— Elasticsearch ?倒排索引?这都是什么?
    除了读写锁,JUC 下面还有个 StampedLock!还不过来了解一下么?
    小伙伴想写个 IDEA 插件么?这些 API 了解一下!
    部署Microsoft.ReportViewe
    关于TFS强制undo他人check out
    几段查看数据库表占用硬盘空间的tsql
    How to perform validation on sumbit only
    TFS 2012 Disable Multiple Check-out
    在Chrome Console中加载jQuery
  • 原文地址:https://www.cnblogs.com/java-stack/p/11952386.html
Copyright © 2011-2022 走看看