java notifyall 唤醒顺序_Java的多线程NotiFyAll()唤醒线程时的顺序问题 | 学步园
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()唤醒线程时的顺序问题 | 学步园相关推荐
- java notify什么意思_Java notify和notifyAll的区别和相同
经常在往上逛,关于在java中notify和notifyAll,经常有人有以下的说法: notify只会通知一个在等待的对象,而notifyAll会通知所有在等待的对象,并且所有对象都会继续运行 并且 ...
- java 多线程的使用_Java的多线程1:线程的使用
概述 public enumState {/*** Thread state for a thread which has not yet started.*/NEW,/*** Thread stat ...
- java条件执行方法_java 开启多线程里面如何加条件判断执行其他逻辑?
方法1:通过Thread类中的isAlive()方法判断线程是否处于活动状态. 线程启动后,只要没有运行完毕,都会返回true. [注]如果只是要等其他线程运行结束之后再继续操作,可以执行t.join ...
- java定时器 并发_【java多线程与并发库】— 定时器的应用 | 学步园
定时器的应用 1. 定时器主要涉及到两个类(java.util包中) @->public class Timer extendsObject (一种工具,线程用其安排以后在后台线程中执行的任务 ...
- java 继承先后顺序_Java中的继承关系的加载顺序
/* 在加载类时,Java虚拟机先加载父类再加载子类,再对静态初始化块. 静态成员变量(类变量).静态方法进行一次初始化. 只有调用new方法时才会创建类的对象.按照父子继承关系进行初始化, 首先执行 ...
- java游戏输赢统计_java利用多线程和Socket实现猜拳游戏
本文实例为大家分享了利用多线程和Socket实现猜拳游戏的具体代码,供大家参考,具体内容如下 实例:猜拳游戏 猜拳游戏是指小时候玩的石头.剪刀.布的游戏.客户端与服务器的"较量", ...
- java 下载暂停实现_Java实现多线程断点下载(下载过程中可以暂停)
线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配. ...
- java数据同步解决方案_Java实现多线程数据同步的几种方法
1. 应用背景 程序在设计当中如果采取多线程操作的时候,如果操作的对象是一个的话,由于多个线程共享同一块内存空间,因此经常会遇到数据安全访问的问题,下面看一个经典的问题,银行取钱的问题:1).你有一张 ...
- java web 初始化方法_Java Web(二) 类的初始化及初始化顺序
1. 问题点 最近在写单例模式的时候碰到了@Autiwired注解注入为NULL的情况,研究一番,发现是和类的初始化顺序有关.先抛出我的问题: //异步处理 public class AsyncMan ...
最新文章
- 客快物流大数据项目(十六):使用脚本创建镜像
- 7 Papers Radios | NeurIPS 2020最佳论文;全卷积网络实现E2E目标检测
- 好的开始是成功的一半 -- 怎么做好一个项目的启动...
- 用 C 语言开发一门编程语言 — 跨平台的可移植性
- 分别用递归和非递归方式实现二叉树先序、中序和后序遍历(java实现)
- vue中用table_Ant-Design-Vue中关于Table组件的使用
- MySQL数据库优化技巧
- python 逆向生成正则表达式_用Python中的正则表达式生成lis
- 王者为什么有些服务器在维护,王者荣耀服务器正在维护中怎么回事 进不去怎么办...
- quartus仿真27:JK触发器构成的同步十进制可逆计数器(分析)
- Hbase roekey设计入门
- [XCTF-Reverse] 69 XCTF 3rd-RCTF-2017_MyDriver2-397
- 鉴相器 matlab,MATLAB锁相环仿真程序求解
- 新浪云python示例_新浪云的基本配置
- Roms版本、工具包及资料文档汇总
- 第一章概述-------第一节--1.2互联网概述
- python中and的用法
- DSP开发的一点概念
- Win32_NetworkAdapter 网卡 参数说明
- 电脑总是弹出explorer.exe->应用程序错误界面(电脑小妙招)
热门文章
- 未来计算机技术的发展趋势有哪些,计算机技术的未来发展趋势,以及其应用范围...
- 易语言远程查询oracle数据库连接,易语言如何连接远程服务器上的数据库,并读取数据...
- [转]jQuery: how to get which button was clicked upon form submission?
- go 获取屏幕分辨率_CS:GO枪神的自我修养 高刷电竞显示器推荐
- 华中科技大学标准c语言程序设计上机试题,答案及报告格式,华中科技大学标准C语言程序设计上机试题、答案及报告格式.pdf...
- hal库开启中断关中断_STM32 HAL库学习系列第9篇---NVIC按键外部中断函数
- springBoot项目启动后无法访问index.html首页或其它controller
- 用RT Server Customizer定制Windows 2008 R2安装光盘
- android点击图片跳转页面底部,【报Bug】安卓底部选项卡webview模式下 点击跳转到某个页面后,会出现底部重叠的问题...
- linux从前往后读取文件夹图片名称,Linux目录和文件中的常用命令(三)