notify()、wait()、notifyAll()这些方法只能在同步化环境中被调用

wait()会释放当前锁,允许其他线程使用对象,让出CPU。

notify()是通知一个线程获取锁

notifyAll()虽然所有的线程都被通知了。但是这些线程都会进行竞争,且只会有一个线程成功获取到锁,在这个线程没有执行完毕之前,其他的线程就必须等待了(只是这里不需要再notifyAll通知了,因为已经notifyAll了,只差获取锁了)

代码需要的结果是tick tock轮流输出

class TickTock {synchronized void tick(boolean running,int i){if(!running){System.out.println("Tick"+i+" running false notify");notify();return;}System.out.println("Tick"+i+" ");System.out.println("Tick"+i+" running true notify");notify();try{System.out.println("Tick"+i+" wait begin");wait();System.out.println("Tick"+i+" wait end");}catch (Exception e){e.printStackTrace();}}synchronized void tock(boolean running,int i){if(!running){System.out.println("Tock"+i+" running false notify");notify();return;}System.out.println("Tock"+i+" ");System.out.println("Tock"+i+" running true notify");notify();try{System.out.println("Tock"+i+" wait begin");wait();System.out.println("Tock"+i+" wait end");}catch (Exception e){e.printStackTrace();}}
}
class WaitNotifyThread implements Runnable{TickTock tt;WaitNotifyThread(TickTock tt){this.tt = tt;}public void run() {if(Thread.currentThread().getName().equals("Tick")){for(int i = 0;i<5;i++){tt.tick(true,i);}tt.tock(false,-1);}else{for(int i = 0;i<5;i++){tt.tock(true,i);}tt.tick(false,-1);}}
}public class WaitNotify{public static void main(String[] args) {TickTock tt = new TickTock();WaitNotifyThread r1 = new WaitNotifyThread(tt);WaitNotifyThread r2 = new WaitNotifyThread(tt);Thread t1 = new Thread(r1,"Tick");Thread t2 = new Thread(r2,"Tock");t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}}
}
F:\JDK\jdk1.8.0_91\bin\java.exe "-javaagent:F:\intellij\idea2018\IntelliJ IDEA 2018.1.5\lib\idea_rt.jar=54021:F:\intellij\idea2018\IntelliJ IDEA 2018.1.5\bin" -Dfile.encoding=UTF-8 -classpath F:\JDK\jdk1.8.0_91\jre\lib\charsets.jar;F:\JDK\jdk1.8.0_91\jre\lib\deploy.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\access-bridge-64.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\cldrdata.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\dnsns.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\jaccess.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\jfxrt.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\localedata.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\nashorn.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\ojdbc6.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\sunec.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\sunjce_provider.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\sunmscapi.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\sunpkcs11.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\zipfs.jar;F:\JDK\jdk1.8.0_91\jre\lib\javaws.jar;F:\JDK\jdk1.8.0_91\jre\lib\jce.jar;F:\JDK\jdk1.8.0_91\jre\lib\jfr.jar;F:\JDK\jdk1.8.0_91\jre\lib\jfxswt.jar;F:\JDK\jdk1.8.0_91\jre\lib\jsse.jar;F:\JDK\jdk1.8.0_91\jre\lib\management-agent.jar;F:\JDK\jdk1.8.0_91\jre\lib\plugin.jar;F:\JDK\jdk1.8.0_91\jre\lib\resources.jar;F:\JDK\jdk1.8.0_91\jre\lib\rt.jar;F:\myeclipseWorkSpace\thread-train\target\classes WaitNotify
Tick0
Tick0 running true notify
Tick0 wait begin
Tock0
Tock0 running true notify
Tock0 wait begin
Tick0 wait end
Tick1
Tick1 running true notify
Tick1 wait begin
Tock0 wait end
Tock1
Tock1 running true notify
Tock1 wait begin
Tick1 wait end
Tick2
Tick2 running true notify
Tick2 wait begin
Tock1 wait end
Tock2
Tock2 running true notify
Tock2 wait begin
Tick2 wait end
Tick3
Tick3 running true notify
Tick3 wait begin
Tock2 wait end
Tock3
Tock3 running true notify
Tock3 wait begin
Tick3 wait end
Tick4
Tick4 running true notify
Tick4 wait begin
Tock3 wait end
Tock4
Tock4 running true notify
Tock4 wait begin
Tick4 wait end
Tock-1 running false notify
Tock4 wait end
Tick-1 running false notifyProcess finished with exit code 0

【六】Java多线程之线程通信notify()、wait()、notifyAll()实现tick tock轮流输出相关推荐

  1. Java多线程之线程通信之生产者消费者阻塞队列版

    Java多线程之线程通信之生产者消费者传统版和阻塞队列版 目录 线程通信之生产者消费者传统版 线程通信之生产者消费者阻塞队列版 1. 线程通信之生产者消费者传统版 题目: 一个初始值为零的变量,两个线 ...

  2. java多线程设计wait、notify、notifyall、synchronized的使用机制

    wait.notify.notifyall.synchronized的使用机制: synchronized(obj) { while(!condition) { obj.wait(); } obj.d ...

  3. java 多线程 8 : 线程通信

    wait(): 使当前线程等待,直到其他线程调用该同步监视器notify()方法 , 或者notifyAll()方法来唤醒该线程. wai()方法有三种形式 , 无参的一直等 :带毫秒的 , 和带微秒 ...

  4. java 管程通信_Java多线程07_线程通信之管程法与信号灯法

    Java多线程07_线程通信之管程法与信号灯法 线程通信 的应用场景是 消费者/生产者问题: 解决线程通信的方法: wait()表示线程一直等待,直到接到通知(会释放锁) wait(long time ...

  5. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  6. java多线程之线程创建和状态

    一.概述 1.上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现 这个机制.时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切 换线 ...

  7. Java多线程间的通信

    Java多线程间的通信 Java还提供了一种线程间通信的机制,这种通信通什么实现? wait,notify等机制    或使用pipeInputStream和pipeOutputStream 1. 线 ...

  8. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  9. java多线程方式轮询,深入理解JAVA多线程之线程间的通信方式

    一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过sy ...

  10. 多线程 4——线程通信、线程池、定时器

    多线程 一.线程通信 1.等待集 2.wait()方法 3.notify() / notifyAll()方法 4.等待队列/同步队列 5.生产者消费者模型 二.线程池 1.jdk中的线程池 2.自己实 ...

最新文章

  1. 记住这35个英文单词,你就可以在RPA界混了!
  2. LeetCode实战:x 的平方根
  3. WindowManager如何被Android深度解析(1)
  4. [BZOJ 2523][Ctsc2001]聪明的学生(递归)
  5. equipment hierarchy download不完整的一个原因
  6. P8207-[THUPC2022 初赛]最小公倍树【Kruskal】
  7. android多个activity绑定一个service,8.1.2 绑定Activity和Service
  8. 2017.9.18 HH的项链 思考记录
  9. ubuntu mysql 数据_Ubuntu下MySQL数据库使用
  10. RocketMQ使用mmap - TODO
  11. 浙大首届人工智能本科生9月入学,纳入竺院图灵班
  12. matplotlib无法显示图片的解决方法(non-gui backend)
  13. 51单片机学习制作定时闹钟及《花海》演奏
  14. Win10电脑版微信来消息提醒工具
  15. 用代理IP上网安全吗?
  16. python中print格式_python中print输出格式有哪些
  17. Luogu P1197
  18. 在 Word 中如何画底线、直线、虚线?
  19. 影响cmos阈值电压的因素
  20. 雷电3接口能干嘛_把雷电3插到TypeC接口了?不认识电脑接口的小伙伴看过来

热门文章

  1. python心脏线绘制代码_用python绘制爱心的基本步骤
  2. The Open Group企业架构副总裁兼亚太区总经理克里斯·福德独家专访
  3. Flutter中有意思的滚动效果 - Sliver系列
  4. [原][OE][官方例子]osgearth_annotation OE地球添加热点标签
  5. Python中GUI图
  6. mysql tode_【20201007】Python操作MySQL数据库
  7. Python数据可视化化第五节(子图的绘制及坐标轴共享)
  8. 剑桥大学研究院总结:26条深度学习经验
  9. 浅谈Golang中select的用法
  10. 【你哥电力电子】 THE BUCK-BOOST 升降压斩波电路2