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. python自学1——代码优化1

    优化了上次的代码,请求方式可接收get和post两种,代码中对两种方式做了判断. 测试结果中提取了测试用例的名称.请求返回的状态.请求的时间. #coding:utf-8 import xlrd im ...

  2. JavaScript入门(四)

    一.数组 1.数组的基本概念 数组是在内存空间中连续存储的一组有序数据的集合.元素在数组中的顺序,称为下标.可以使用下标访问数组的每个元素. 2.如何声明一个数组 ①使用字面量声明:var arr = ...

  3. 模仿Spring实现注解注入

    写这个极其蛋疼,我一直在想我们用SSM写项目时,写Service和Controller的时候,会给Service和Controller私有属性,比如Service需要dao,Controller需要S ...

  4. POI处理Excel中的日期数据类型

    在POI处理Excel中的日期类型的单元格时,如果仅仅是判断它是否为日期类型的话,最终会以NUMERIC类型来处理. 正确的处理方法是先判断单元格 的类型是否则NUMERIC类型, 然后再判断单元格是 ...

  5. RPC框架实现思路浅析

    第一部分,设计分析 远程调用要解决的主要问题: 1,序列化 : 如何将对象转化为二进制数据进行传输,如何将二进制数据转化对象 2,数据的传输(协议,第三方框架) 3,服务的注册/发现,单点故障,分布式 ...

  6. vue中引入swiper(vue中的滑块组件vue-awesome-swiper)

    第一步安装 npm install vue-awesome-swiper --save 第二部在main.js中引入 import VueAwesomeSwiper from 'vue-awesome ...

  7. jvm系列 (五) ---类的加载机制

    类的加载机制 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 jvm系列 (四) ---强.软.弱.虚引用 我的博客目录 什么是类 ...

  8. Opencv入门-第一回-梦牵机器视觉翼,初识Opencv域(安装Opencv)

    各位看官,您是不是瞅着Opencv进来的?(你这不是废话吗>_>) 这Opencv(开源计算机视觉库)啊,说来话长,最初是上个世纪末(1999年)由Intel建立起来的.近十多年人工智能这 ...

  9. asp.net core 2.0 web api基于JWT自定义策略授权

    JWT(json web token)是一种基于json的身份验证机制,流程如下: 通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端 ...

  10. 垂直居中小记 line-height table vertical-align:middle

    垂直居中分两种情况:1.父元素高度确定的单行文本        2.以及父元素高度确定的多行文本. 1.垂直居中-父元素高度确定的单行文本的竖直居中的方法是通过设置父元素的 height 和 line ...