public class ThreadPriority {public static void main(String[] args) {Producer p = new Producer();p.start();for (int i = 1; i

由于slotNum++;改变了监视的实例,所以导致当前线程不是此对象监视器的所有者。这才是真正的原因。

由于做了自加操作,Integer 作了自动拆箱,自减完成后又自动装箱了,因此在 slotNum++之后的 slotNum 与之前的 slotNum 不是同一个对象了,所以在 notifyAll 时会抛出无效的监视器状态异常。

参考这个

修改后的代码如下:

package future;

import java.util.concurrent.atomic.AtomicInteger;

public class ThreadPriority {

public static void main(String[] args) {

for (int i = 1; i < 5; i++) {

Consumer cr = new Consumer();

cr.setPriority(i);

cr.start();

}

Producer p = new Producer();

p.start();

}

}

class Consumer extends Thread {

public Consumer()

{

setDaemon(true);

}

public void run() {

try {

synchronized (Producer.slotNum) {

if (Producer.slotNum.get()== 0)

Producer.slotNum.wait();

Producer.slotNum.decrementAndGet();

System.out.println(" Thread  " + this.getId() + " consumer 1!");

}

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

class Producer extends Thread {

public static AtomicInteger  slotNum = new AtomicInteger(10);

public Producer()

{

setDaemon(true);

}

// public void addSlot()

// {

//  slotNum ++;

// }

public void run() {

synchronized (slotNum) {

//   slotNum++;

//   slotNum = slotNum +1 ;

//   addSlot();

slotNum.incrementAndGet();

slotNum.notifyAll();

System.out.println(" Thread " + this.getId() + " producer 1!");

}

}

}

java notifyall 唤醒顺序_Java的多线程NotiFyAll()唤醒线程时的顺序问题 | 学步园相关推荐

  1. java notify什么意思_Java notify和notifyAll的区别和相同

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

  2. java 多线程的使用_Java的多线程1:线程的使用

    概述 public enumState {/*** Thread state for a thread which has not yet started.*/NEW,/*** Thread stat ...

  3. java条件执行方法_java 开启多线程里面如何加条件判断执行其他逻辑?

    方法1:通过Thread类中的isAlive()方法判断线程是否处于活动状态. 线程启动后,只要没有运行完毕,都会返回true. [注]如果只是要等其他线程运行结束之后再继续操作,可以执行t.join ...

  4. java定时器 并发_【java多线程与并发库】— 定时器的应用 | 学步园

    定时器的应用 1.  定时器主要涉及到两个类(java.util包中) @->public class Timer extendsObject (一种工具,线程用其安排以后在后台线程中执行的任务 ...

  5. java 继承先后顺序_Java中的继承关系的加载顺序

    /* 在加载类时,Java虚拟机先加载父类再加载子类,再对静态初始化块. 静态成员变量(类变量).静态方法进行一次初始化. 只有调用new方法时才会创建类的对象.按照父子继承关系进行初始化, 首先执行 ...

  6. java游戏输赢统计_java利用多线程和Socket实现猜拳游戏

    本文实例为大家分享了利用多线程和Socket实现猜拳游戏的具体代码,供大家参考,具体内容如下 实例:猜拳游戏 猜拳游戏是指小时候玩的石头.剪刀.布的游戏.客户端与服务器的"较量", ...

  7. java 下载暂停实现_Java实现多线程断点下载(下载过程中可以暂停)

    线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配. ...

  8. java数据同步解决方案_Java实现多线程数据同步的几种方法

    1. 应用背景 程序在设计当中如果采取多线程操作的时候,如果操作的对象是一个的话,由于多个线程共享同一块内存空间,因此经常会遇到数据安全访问的问题,下面看一个经典的问题,银行取钱的问题:1).你有一张 ...

  9. java web 初始化方法_Java Web(二) 类的初始化及初始化顺序

    1. 问题点 最近在写单例模式的时候碰到了@Autiwired注解注入为NULL的情况,研究一番,发现是和类的初始化顺序有关.先抛出我的问题: //异步处理 public class AsyncMan ...

最新文章

  1. 客快物流大数据项目(十六):使用脚本创建镜像
  2. 7 Papers Radios | NeurIPS 2020最佳论文;全卷积网络实现E2E目标检测
  3. 好的开始是成功的一半 -- 怎么做好一个项目的启动...
  4. 用 C 语言开发一门编程语言 — 跨平台的可移植性
  5. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历(java实现)
  6. vue中用table_Ant-Design-Vue中关于Table组件的使用
  7. MySQL数据库优化技巧
  8. python 逆向生成正则表达式_用Python中的正则表达式生成lis
  9. 王者为什么有些服务器在维护,王者荣耀服务器正在维护中怎么回事 进不去怎么办...
  10. quartus仿真27:JK触发器构成的同步十进制可逆计数器(分析)
  11. Hbase roekey设计入门
  12. [XCTF-Reverse] 69 XCTF 3rd-RCTF-2017_MyDriver2-397
  13. 鉴相器 matlab,MATLAB锁相环仿真程序求解
  14. 新浪云python示例_新浪云的基本配置
  15. Roms版本、工具包及资料文档汇总
  16. 第一章概述-------第一节--1.2互联网概述
  17. python中and的用法
  18. DSP开发的一点概念
  19. Win32_NetworkAdapter 网卡 参数说明
  20. 电脑总是弹出explorer.exe->应用程序错误界面(电脑小妙招)

热门文章

  1. 未来计算机技术的发展趋势有哪些,计算机技术的未来发展趋势,以及其应用范围...
  2. 易语言远程查询oracle数据库连接,易语言如何连接远程服务器上的数据库,并读取数据...
  3. [转]jQuery: how to get which button was clicked upon form submission?
  4. go 获取屏幕分辨率_CS:GO枪神的自我修养 高刷电竞显示器推荐
  5. 华中科技大学标准c语言程序设计上机试题,答案及报告格式,华中科技大学标准C语言程序设计上机试题、答案及报告格式.pdf...
  6. hal库开启中断关中断_STM32 HAL库学习系列第9篇---NVIC按键外部中断函数
  7. springBoot项目启动后无法访问index.html首页或其它controller
  8. 用RT Server Customizer定制Windows 2008 R2安装光盘
  9. android点击图片跳转页面底部,【报Bug】安卓底部选项卡webview模式下 点击跳转到某个页面后,会出现底部重叠的问题...
  10. linux从前往后读取文件夹图片名称,Linux目录和文件中的常用命令(三)