并发编程(六)Object类中线程相关的方法详解
一、notify()
作用:唤醒一个正在等待该线程的锁的线程
PS : 唤醒的线程不会立即执行,它会与其他线程一起,争夺资源
/**
* Object类的notify()和notifyAll()方法详解
*/
public class MyNotify { // 在多线程间共享的对象上使用wait
private String[] shareObj = {"true"}; public static void main(String[] args) {
MyNotify test = new MyNotify();
//创建3个等待线程
ThreadWait threadWait1 = test.new ThreadWait("线程1");
ThreadWait threadWait2 = test.new ThreadWait("线程2");
ThreadWait threadWait3 = test.new ThreadWait("线程3");
//创建一个解放线程对象,用于通知等待线程运行
ThreadNotify threadNotify = test.new ThreadNotify("释放线程"); //等待线程启动,在释放线程把锁释放之后,争夺运行的机会
threadWait1.start();
threadWait2.start();
threadWait3.start(); //释放线程启动,sleep3秒后释放线程
threadNotify.start();
} /**
* 线程等待类
*/
class ThreadWait extends Thread { //调用父类构造方法设置线程名称
public ThreadWait(String name) {
super(name);
} public void run() {
synchronized (shareObj) {
while ("true".equals(shareObj[0])) {
System.out.println("线程" + this.getName() + "开始等待");
long startTime = System.currentTimeMillis();
try {
shareObj.wait();//无尽等待,直至notify()或者notifyAll()
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("线程" + this.getName()
+ "等待时间为:" + (endTime - startTime));
}
}
System.out.println("线程" + getName() + "等待结束");
}
} /**
* 线程释放类
*/
class ThreadNotify extends Thread { //调用父类构造方法设置线程名称
public ThreadNotify(String name) {
super(name);
} public void run() {
try {
// 给等待线程等待时间
sleep(3000);//此时sleep方法会获取对象锁,其他线程处于等待并获取锁的状态
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (shareObj) {
System.out.println(this.getName() + "开始准备通知");
shareObj[0] = "false";
shareObj.notify();//解放一个正在等待的线程(随机)
// shareObj.notifyAll();//解放所有等待的线程
System.out.println(this.getName() + "通知结束");
}
System.out.println(this.getName() + "运行结束");
}
}
}
详见这里~

二、notifyAll()
作用:唤醒所有正在等待该线程的锁的线程
PS:并不一定会按线程优先级来执行
三、wait()
作用:导致当前的线程进入无尽等待,直到其他线程调用此对象的notify( ) 方法或 notifyAll( ) 方法
四、wait(long timeout)
作用:导致当前的线程等待,直到其他线程调用此对象的notify() 方法或 notifyAll() 方法,或者指定的时间过完。
五、wait(long timeout, int nanos)
作用:类似于wait(long timeout)方法,更精准,附加时间在毫微秒范围0-999999。
六、常见异常
- IllegalArgumentException -- 如果超时的值是负的或毫微秒的值不在0-999999范围内。
- IllegalMonitorStateException -- 如果当前线程不是对象监视器的拥有者。
- InterruptedException -- 如果另一个线程中断了当前线程。当这种异常被抛出当前线程的中断状态被清除。
并发编程(六)Object类中线程相关的方法详解的更多相关文章
- PHP 中 16 个魔术方法详解
PHP 中 16 个魔术方法详解 前言 PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __constru ...
- moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解
☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>和<moviepy音视频剪辑:moviepy中的剪辑基类Cl ...
- “全栈2019”Java多线程第五章:线程睡眠sleep()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- php_DWZ-JUI中碰到的问题解决方法详解(thinkphp+dwz)
原文:php_DWZ-JUI中碰到的问题解决方法详解(thinkphp+dwz) 折腾了两天,dwz删除后,数据不能自动刷新,解决方案,直接看图 . 1. 删除.修改状态后无法刷新记录: 在dwz. ...
- “全栈2019”Java多线程第七章:等待线程死亡join()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- python中requests库使用方法详解
目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...
- Object类中的五种方法
clone() Object类源码:protected native Object clone() throws CloneNotSupportedException; 这里有个问题:为什么Sun公司 ...
- Java中 hashCode()方法详解
先来看下Object源码里hashcode方法: /** * Returns a hash code value for the object. This method is * s ...
- Java中hashCode与equal方法详解
转载自http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...
随机推荐
- lombook插件的说明
lombok是一个可以帮助我们简化java代码编写的工具类,尤其是简化javabean的编写,即通过采用注解的方式,消除代码中的构造方法,getter/setter等代码,使我们写的类更加简洁,当然, ...
- java基本数据类型总结 类型转换 final关键字的用法
java基本数据类型总结 Java数据类型总结 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式.接触每种语言的时候,都会存在数据类型的认识,有复杂的. ...
- 小程序 RecorderManager计时不准确问题
官方文档:RecorderManager 录音管理器,内部实现计时不准确.有以下俩个问题: 点击暂停继续,当录音结束时,stop返回的时间包含了暂停的那一段时间. 正常录音,录音文件的时长有概率少个1 ...
- ARDUBOY游戏开发之路(一) 初识ARDUBOY
一.什么是ARDUBOY Arduboy是一个仅有信用卡大小的创造.分享游戏的开放平台.爱好者可以免费从Arduboy中选择一款经典的游戏,然后将游戏在目前最流行的arduino平台上编程.Ardub ...
- Spring整合WebSocket
WebSocket,干什么用的?我们有了HTTP,为什么还要用WebSocket?很多同学都会有这样的疑问.我们先来看一个场景,大家的手机里都有微信,在微信中,只要有新的消息,这个联系人的前面就会有一 ...
- 轻轻松松学CSS:float
float属性,会使元素向左或向右移动,其周围的元素也会重新排列.float不仅自己飘忽不定,还对周围元素有影响,这种影响力不容小觑.他捉摸不定(浮动规律不好把握),他干涉他国内政(对周围元素有影响) ...
- 腾讯大牛半年心血高级编程PDF,帮你轻松构建企业级Web应用
毫无疑问,Java 是这些年来最流行的编程语言之一.它无处不在一计算机. 手机.网站以及各种嵌入式设备中都存在着大量的Java 应用程序,而其中应用最为广泛的应该就是Java EE Web应用程序(以 ...
- 使用Android的硬件缩放技术优化执行效率
Unity3D研究院之使用Android的硬件缩放技术优化执行效率 http://www.xuanyusong.com/archives/3205 Android中GLSurfaceView在横竖屏切 ...
- [BUUOJ记录] [GXYCTF2019]BabySQli
有点脑洞的题,题目不难,主要考察注入和联合查询的一个小特点 进入题目是一个登录框,看看源代码,在search.php文件中发现了这个 大写的字母和数字很明显是base32,先用base32解码一下,发 ...
- 面试:为了进阿里,又把并发CAS(Compare and Swap)实现重新精读一遍
该系列文章已收录在公众号[Ccww技术博客],原创技术文章第一时间推出 前言 在面试中,并发线程安全提问必然是不会缺少的,那基础的CAS原理也必须了解,这样在面试中才能加分,那来看看面试可能会问那些问 ...