今天看到一篇问题,提问线程唤醒顺序。

具体代码如下:

 import java.util.LinkedList;
import java.util.List;public class ThreadRunSort {/** * 对象锁 */  private final Object object = new Object();  private List<Integer> sleep = new LinkedList<>();private List<Integer> notify = new LinkedList<>();/** * 该线程作为一个唤醒线程 */  public void startThread(int i) {  Thread t = new Thread(new Runnable() {  @Override  public void run() {  synchronized (object) {  try {System.out.println(Thread.currentThread().getName()+"进入休眠");sleep.add(i);object.wait();System.out.println(Thread.currentThread().getName()+"线程已经唤醒");notify.add(i);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}  }  });  t.setName("Thread"+i);t.start();  }  public static void main(String[] args) {  ThreadRunSort a = new ThreadRunSort();for(int i =1;i<22;i++){a.startThread(i);}try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println();for(int i =1;i<22;i++){synchronized (a.object) {a.object.notify();}}try {Thread.sleep(3000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("休眠顺序"+a.sleep);System.out.println("唤醒顺序"+a.notify);}
}

发现,输入的顺序是不定的,比如:

休眠顺序[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
唤醒顺序[1, 5, 4, 3, 2, 7, 6, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 21]

但是,当修改了其中notify代码:

for(int i =1;i<22;i++){try {Thread.sleep(10);  // 在这里sleep确保notify会顺序执行} catch (InterruptedException e) {e.printStackTrace();}synchronized (a.object) {a.object.notify();}}

顺序就变成

休眠顺序[1, 3, 4, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
唤醒顺序[1, 3, 4, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]

可以理解在wait时候,放入的是一个FIFO的队列?每次notify其实就是出队的形式。(上面顺序有问题是因为线程按顺序出队后,抢占锁的顺序和CPU有关)

但是,把代码改成notifyAll后:

休眠顺序[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
唤醒顺序[21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

变成了stack出栈的形式。。

具体的问题还要再研究下。。。。

原问题传送门:https://ask.csdn.net/questions/387308#answer_972330

notifyAll notify顺序相关推荐

  1. java notifyall 唤醒顺序_Java线程中的notifyAll唤醒操作(推荐)

    注意: java中的notifyAll和notify都是唤醒线程的操作,notify只会唤醒等待池中的某一个线程,但是不确定是哪一个线程,notifyAll是针对指定对象里面的所有线程执行唤醒操作,指 ...

  2. java notifyall 唤醒顺序_Java的多线程NotiFyAll()唤醒线程时的顺序问题 | 学步园

    public class ThreadPriority {public static void main(String[] args) {Producer p = new Producer();p.s ...

  3. Java线程详解:wait、notify、notifyAll、join

    线程的概念 线程是进程的子任务,一个进程可以创建多个线程,线程不拥有系统资源,但是线程可以共享进程的资源,而线程自己也有一块独立的小块空间:包括堆栈,程序计数器和局部变量. 线程是CPU调度和分派的基 ...

  4. Adapter中notify(),notifyAll(),notifyDataSetChanged(),notifyDataSetInvalidaded()方法的区别

    1.notify()与notifyAll() notify()和notifyAll()一般用于唤醒被锁或等待中的adapter,两者都是object对象用于通知处在等待该对象的线程方法.notify唤 ...

  5. Java中notify和notifyAll的区别 - 何时以及如何使用

    Java  notify   vs notifyAll notify和notifyAll方法之间有什么区别是棘手的Java问题之一! Condition 是个什么玩意? 提几个问题,从问题中去了解去学 ...

  6. notify()方法、notifyAll()方法和wait()方法 详解

    线程作为程序内部的多个执行流,相互之间是可以通讯的.线程间通讯可以通过多种方式来进行,例如:线程间可以共享变量来进行通讯,使每个线程根据共享变量的值进行操作和运算,当通过共享变量进行通讯时,通常需要引 ...

  7. notify()方法、notifyAll()方法和wait()方法

    线程作为程序内部的多个执行流,相互之间是可以通讯的.线程间通讯可以通过多种方式来进行,例如:线程间可以共享变量来进行通讯,使每个线程根据共享变量的值进行操作和运算,当通过共享变量进行通讯时,通常需要引 ...

  8. notify、notifyAll、wait思考

    1.在java中,每个对象都有两个池,锁(monitor)池和等待池,每个对象都能够被作为"监视器monitor"--指一个拥有一个独占锁 wait()/notify()方法定义在 ...

  9. volatile,wait,notify关键字

    文章目录 一.volatile关键字 二.wait 和 notify wait notify notifyAll wait 和 sleep 的区别 顺序打印ABC 一.volatile关键字 vola ...

最新文章

  1. Opengl-实例化(不知道为啥叫实例化,感觉应该叫一次批量渲染)
  2. 自动解析复杂类的属性 实现归档或者进行序列化 反序列话的时候为每一个属性添加序列化方法的繁琐...
  3. ubuntu 升级nodejs 和 npm
  4. VTK:PolyData之IterateOverLines
  5. 23种设计模式之解释器模式
  6. 老子《道德经》第三十五章
  7. curl查看swift状态命令_前端应该会的23个linux常用命令
  8. 运筹学作业(一)——线性规划
  9. linux系统关于mysql的命令_[操作系统]Linux 操作MySql命令
  10. 点评2009年PHP十大图书(2)
  11. [android 游戏源码]-体育游戏-疯狂足球源码
  12. 利用波士顿房价数据集实现房价预测
  13. html怎么设置字体的背景颜色,html怎样设置字体的背景颜色?
  14. 算法题9-最短路径问题-Dijkstra算法
  15. 嵌入式开发语言-C语言编程
  16. 2019xupt-acm校赛 题解(C.给你一个666)by出题组tongtong
  17. Vue2Editor 中文API
  18. Intellij IDEA File Cache Conflict
  19. [论文速览] Probing Neural Network Comprehension of Natural Language Arguments
  20. SVN为不同用户分配不同的目录权限

热门文章

  1. vue注册Regist.vue
  2. 小学计算机教师德育工作计划,XX年春季小学部教师德育工作计划.doc
  3. 不容易系列之一(九度教程第 94 题)
  4. conditional layer normalization
  5. 2019年-APP测试流程整理
  6. php new mpdf,php – mpdf无视javascript
  7. android lichee编译脚本解析
  8. PostgreSQL什么才算是长事务
  9. linux .deb文件的解压与制作.deb包的压缩命令
  10. 集群聊天服务器项目(C++ 11实现)