一、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类中线程相关的方法详解的更多相关文章

  1. PHP 中 16 个魔术方法详解

    PHP 中 16 个魔术方法详解   前言 PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __constru ...

  2. moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>和<moviepy音视频剪辑:moviepy中的剪辑基类Cl ...

  3. “全栈2019”Java多线程第五章:线程睡眠sleep()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. php_DWZ-JUI中碰到的问题解决方法详解(thinkphp+dwz)

    原文:php_DWZ-JUI中碰到的问题解决方法详解(thinkphp+dwz) 折腾了两天,dwz删除后,数据不能自动刷新,解决方案,直接看图  . 1. 删除.修改状态后无法刷新记录: 在dwz. ...

  5. “全栈2019”Java多线程第七章:等待线程死亡join()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  6. python中requests库使用方法详解

    目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...

  7. Object类中的五种方法

    clone() Object类源码:protected native Object clone() throws CloneNotSupportedException; 这里有个问题:为什么Sun公司 ...

  8. Java中 hashCode()方法详解

    先来看下Object源码里hashcode方法: /**     * Returns a hash code value for the object. This method is      * s ...

  9. Java中hashCode与equal方法详解

    转载自http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...

随机推荐

  1. HM16.0之帧内模式——xCheckRDCostIntra()函数

    参考:https://blog.csdn.net/nb_vol_1/article/category/6179825/1? 1.源代码: Void TEncCu::xCheckRDCostIntra( ...

  2. ubuntu18.04 开机定时启动任务

    1,crontab 格式:M H D m d cmd == 分 时 天 月 周几 命令 参数 : crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑 ...

  3. 标准git请求

    initCate() // 定义加载文章分类的方法 function initCate() { $.ajax({ method: 'GET', url: '/my/article/cates', su ...

  4. Welcome To CUG_YZL's cnblogs

    Welcome To CUG_YZL's cnblogs  My name is YZL, studied in China University of Geosciences Wuhan now.W ...

  5. json对象遍历顺序问题

    对json对象遍历我们一般使用for in循环,或者Object.keys + 数组方法.在接触js以来听到过一种说法: for in 遍历顺序是不可靠的 但是在实际开发中for in 循环也是按照其 ...

  6. 基于Celery在多台云服务器上实现分布式

    起源 最近参加公司里的一个比赛,比赛内容里有一项是尽量使用分布式实现项目.因为项目最终会跑在jetsonnano,一个贼卡的开发板,性能及其垃圾.而且要求使用python? 找了很多博客,讲的真的是模 ...

  7. UVA 11292-Dragon of Loowater (贪心)

    Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major problem. The shor ...

  8. 15 自定义分页pagination全局组件

    1.Pagination.vue <template> <el-pagination @size-change="handleSizeChange" @curre ...

  9. Oracle12C创建scott账户

    Oracle12C创建scott账户 具体步骤: 打开SqlPlus 输入用户名和密码用户名:sys口令:sys as sysdba 创建c##scott用户CREATE USER c##scott ...

  10. python基础四(json\os\sys\random\string模块、文件、函数)

    一.文件的修改 文件修改的两种思路: 1.把文件内容拿出来,做修改后,清空原来文件的内容,然后把修改过的文件内容重新写进去. 步骤: 1.打开文件:f=open('file','a+')  #必须用a ...