1.wait,notify,notifyAll是Object的方法。他们必须在同步块中使用,并且当前线程必须已经获取了锁。wait方法,用来释放同步块对象上的锁,并且等待其他的线程唤醒(notify)。notify用来唤醒某一个线程,但是不会立即释放锁,被唤醒线程可以再次获取锁。notifyAll唤醒所有等待在object上面的线程,使得他们都可以再次获取锁。

一个 wait的线程,被被唤醒之后不会立刻运行,首先他得 再次获取 对象的锁,同样,一个wait的线程被中断时,他也不会立即运行,需要等待再次获取 对象的锁。

如果wait的线程可以重新运行,那么会从 他 wait的代码部分开始 继续运行。

用一个例子,来查看wait,notify的使用

public class Test {
public static void main(String[] args) {
new Test().test();
} private Thread t1 = new Thread(this::waitTest);
private Thread t2 = new Thread(this::notifyTest); private Object o = new Object(); public void test(){
t1.start();
t2.start();
} public void waitTest() {
synchronized (o) {
System.out.println("before wait");
try {
o.wait();
} catch (InterruptedException e) {
//do nothing
}
System.out.println("wake up");
}
} public void notifyTest(){
//休眠一段时间 让wait线程先获取锁
sleep();
synchronized (o){
System.out.println();
o.notify();
o.notify();
System.out.println("notify over");
sleep();
sleep();
System.out.println("notify sleep over"); }
}
public void sleep(){
try {
System.out.println("sleep 3000 ms");
Thread.sleep(3000);
System.out.println("sleep over");
} catch (InterruptedException e) {
//do nothing
}
}
}

2.sleep,yield是Thread的静态方法。sleep用来让当前线程休眠一段时间,在这段时间内,他不会获得CPU时间,yield()方法称为“退让”,它把运行机会让给了同等优先级的其他线程,但是也有可能该线程会继续进行。sleep和yield不必须在同步块中运行,也就是说他们其实没有太大的联系。如果在同步块中使用,他们都不会释放锁。sleep,yield总是作用于当前线程,因此用这种方式来使用sleep和yield是错误的。

Thread t = new Thread;
t.sleep();
t.yield();
//他们并不能让线程t进行休眠或退让,而是作用与当前线程

sleep,yield,wait,notify,notifyAll的更多相关文章

  1. Thread对象的yield(),wait(),notify(),notifyall()

    Thread类中的主要方法: join()方法:让一个线程强制运行,线程强制运行期间,其他线程无法运行,必须等到此线程完成之后才可以继续执行. setDaemon():设置线程为后台线程,这样即使Ja ...

  2. 并发编程——线程中sleep(),yield(),join(),wait(),notify(),notifyAll()区别

    前言 今天简单的讲一讲线程中sleep(),join(),yield(),wait(),notify(),notifyAll()这些方法的使用以及区别. 不过在讲这些方法之前,需要简单的介绍一下锁池和 ...

  3. java 多线程之wait(),notify,notifyAll(),yield()

    wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll()的功能.因为都个对像都 ...

  4. JAVA 线程状态以及synchronized,wait,sleep,yield,notify,notifyAll

    java线程存在以下几种状态: 1: 创建状态(New):线程被new出来,还未调用start 2: 就绪状态(Runnable):又称为可执行状态,调用线程的start方法后,线程处于就绪状态,,线 ...

  5. Object的wait/notify/notifyAll&&Thread的sleep/yield/join/holdsLock

    一.wait/notify/notifyAll都是Object类的实例方法 1.wait方法:阻塞当前线程等待notify/notifyAll方法的唤醒,或等待超时后自动唤醒. wait等待其实是对象 ...

  6. java之sleep(),join(),yield(),wait(),notify()、notifyAll()区别

    1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...

  7. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  8. Java多线程:线程状态以及wait(), notify(), notifyAll()

    一. 线程状态类型1. 新建状态(New):新创建了一个线程对象.2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运 ...

  9. 零基础学习java------day18------properties集合,多线程(线程和进程,多线程的实现,线程中的方法,线程的声明周期,线程安全问题,wait/notify.notifyAll,死锁,线程池),

    1.Properties集合 1.1 概述: Properties类表示了一个持久的属性集.Properties可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串 一个属性列表可包含另 ...

随机推荐

  1. WebStorm ES6 语法支持设置&babel使用及自动编译

    一.语法支持设置 Preferences > Languages & Frameworks > JavaScript 二.Babel安装 1.全局安装 npm install -g ...

  2. 字符编码知识简介和iconv函数的简单使用

    字符编码知识简介和iconv函数的简单使用 字符编码知识简介 我们知道,在计算机的世界其实只有0和1.期初计算机主要用于科学计算,而我们知道一个数,除了用我们常用对10进制表示,也可以用2进制表示,所 ...

  3. H - transaction transaction transaction

    https://vjudge.net/contest/184514#problem/H 题意: 一个商人为了赚钱,在城市之间倒卖商品.有n个城市,每个城市之间有且只有一条无向边连通.给出n个城市的货物 ...

  4. CSS display和visibility的用法和区别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt408 大多数人很容易将CSS属性display和visibility混淆,它 ...

  5. 用shell批量编码转换

    -------------------------------------文件内容转换:iconv-------------------------------------- 通常,从其他平台拷贝过来 ...

  6. springmvc注解

    简介: handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型) A.处理requet uri 部分(这里指uri templat ...

  7. 验证Oracle收集统计信息参数granularity数据分析的力度

    最近在学习Oracle的统计信息这一块,收集统计信息的方法如下: DBMS_STATS.GATHER_TABLE_STATS ( ownname VARCHAR2, ---所有者名字 tabname ...

  8. 201521123052《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  9. 201521123061 《Java程序设计》第四周学习总结

    201521123061 <Java程序设计>第四周学习总结 1. 本章学习总结 (1)思维导图: --- (2)上课内容总结: 第四周学习了Java中的继承与多态,思维导图中已经给出了本 ...

  10. 201521123029《Java程序设计》第三周学习总结

    1.本周学习总结 2.书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; pu ...