java中wait和sleep的区别

在本篇文章中,我们将会讨论一下java中wait()和sleep()方法的区别。并讨论一下怎么使用这两个方法。

Wait和sleep的区别

wait() 是Object中定义的native方法:

public final native void wait(long timeout) throws InterruptedException;

所以每一个类的实例都可以调用这个方法。wait()只能在synchronized block中调用。它会释放synchronized时加在object上的锁。

sleep()是定义Thread中的native静态类方法:

public static native void sleep(long millis) throws InterruptedException;

所以Thread.sleep()可以在任何情况下调用。Thread.sleep()将会暂停当前线程,并且不会释放任何锁资源。

我们先看一下一个简单的wait使用:

@Slf4j

public class WaitUsage {

private static Object LOCK = new Object();

public static void WaitExample() throws InterruptedException {

synchronized (LOCK) {

LOCK.wait(1000);

log.info("Object '" + LOCK + "' is woken after" +

" waiting for 1 second");

}

}

}

再看一下sleep的使用:

@Slf4j

public class SleepUsage {

public static void sleepExample() throws InterruptedException {

Thread.sleep(1000);

log.info(

"Thread '" + Thread.currentThread().getName() +

"' is woken after sleeping for 1 second");

}

}

唤醒wait和sleep

sleep()方法自带sleep时间,时间过后,Thread会自动被唤醒。或者可以通过调用interrupt()方法来中断。

相比而言wait的唤醒会比较复杂,我们需要调用notify() 和 notifyAll()方法来唤醒等待在特定wait object上的线程。

notify()会根据线程调度的机制选择一个线程来唤醒,而notifyAll()会唤醒所有等待的线程,由这些线程重新争夺资源锁。

wait,notity通常用在生产者和消费者情形,我们看下怎么使用:

@Slf4j

public class WaitNotifyUsage {

private int count =0;

public void produceMessage() throws InterruptedException {

while(true) {

synchronized (this) {

while (count == 5) {

log.info("count == 5 , wait ....");

wait();

}

count++;

log.info("produce count {}", count);

notify();

}

}

}

public void consumeMessage() throws InterruptedException {

while (true) {

synchronized (this) {

while (count == 0) {

log.info("count == 0, wait ...");

wait();

}

log.info("consume count {}", count);

count--;

notify();

}

}

}

}

看下怎么调用:

@Test

public void testWaitNotifyUsage() throws InterruptedException{

WaitNotifyUsage waitNotifyUsage=new WaitNotifyUsage();

ExecutorService executorService=Executors.newFixedThreadPool(4);

executorService.submit(()-> {

try {

waitNotifyUsage.produceMessage();

} catch (InterruptedException e) {

e.printStackTrace();

}

});

executorService.submit(()-> {

try {

waitNotifyUsage.consumeMessage();

} catch (InterruptedException e) {

e.printStackTrace();

}

});

Thread.sleep(50000);

}

本文的例子可以参考https://github.com/ddean2009/learn-java-concurrency/tree/master/wait-sleep

更多教程请参考 flydean的博客

java中的wait和sleep_java中wait和sleep的区别相关推荐

  1. 使用java中replaceAll方法替换字符串中的反斜杠

    今天在项目中使用java中replaceAll方法将字符串中的反斜杠("\")替换成空字符串(""),结果出现如下的异常: 1 java.util.regex. ...

  2. java super是引用变量吗_Java中super的几种用法并与this的区别

    1.     子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base" ...

  3. java中super用来定义父类,Java中super的几种用法及与this的区别

    综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺 ...

  4. java中组件与容器_java中的容器组件和非容器组件

    1.java使用到的图形类主要在java.awt 与javax.swing包中. 2.java.awt 与 javax.swing包的区别: ① java.awt中使用的图形类都是依赖于系统的图形库的 ...

  5. java interface class_java interface和class中的协变

    协变 Java中的协变是指,当发生继承时,子类中重写父类的方法时,可以返回父类方法返回类型的子类型.比如: class SuperClass{} class SubClass extends Supe ...

  6. java boolean几个字节_Java中boolean类型到底占用多少个字节?

    1.时间:2017-07-03 07:37:06YuanMxy 2.问题描述:今天在复习java基础的时候发现一小问题,Java中boolean类型到底占用多少个字节? 3.问题解答: (1)什么是b ...

  7. java主线程捕获子线程中的异常

    java主线程捕获子线程中的异常 参考文章: (1)java主线程捕获子线程中的异常 (2)https://www.cnblogs.com/jpfss/p/10272726.html (3)https ...

  8. java 基本类型的引用_Java中的基本数据类型与引用数据类型

    一.基本数据类型 byte.short.int.long(整数类型) float.double(浮点数类型) char(字符型) boolean(布尔类型 ) Java数据大多数存放在堆栈中.栈区:存 ...

  9. java对于数组的定义_Java中方法的定义与使用,以及对数组的初步了解。

    方法 方法的含义 定义: 方法就是用来完成解决某件事情或实现某个功能的办法. 方法实现的过程中,会包含很多条语句用于完成某些有意义的功能--通常是处理文本,控制输入或计算数值. 我们可以通过在程序代码 ...

最新文章

  1. 非单身勿点,这里是单身汪专属情人节~
  2. 泰晤士高等教育2020年新兴经济体大学排名出炉,81所中国大陆高校上榜!
  3. If-Modified-Since和If-None-Match
  4. PYG教程【五】链路预测
  5. Android当中layer-list使用来实现多个图层堆叠到一块儿
  6. ubuntu创建新用户并设置sudo权限
  7. mysql sql语句书写之面试部分
  8. 谷歌浏览器如何将繁体字设置成中文?
  9. java -jar 内存溢出_JAVA系统启动栈内存溢出-StackOverflowError
  10. MySQL学习-连接查询
  11. 转化率高的爆款文案都是如何写出来的?
  12. 美赛整理之带参数的常微分方程拟合问题研究
  13. python培训 首选马哥教育
  14. python下载所有 XKCD 漫画
  15. SAP ABAP STANDARD TABLE,SORTED TABLE和HASHED TABLE简介
  16. Python 刷题笔记:背包问题
  17. 大数据分析笔记 (2) - 数据分析统计方法
  18. Evolutionary Acyclic Graph Partition
  19. 公司邮箱如何申请?如何申请公司邮箱?公司邮箱号码大全
  20. 2020年7月指数定期审核与调整 | TokenInsight

热门文章

  1. android source镜像源_说要替代安卓的Fuchsia OS,国内镜像上线了!
  2. 用反向传导模拟电子运动并模拟HF,HCl,HBr
  3. MIT_18.03_微分方程_Laplace_Transform_拉普拉斯变换_Notes
  4. 【数理知识】《矩阵论》方保镕老师-第3章-矩阵的分解
  5. P12 离散控制系统-《Matlab/Simulink与控制系统仿真》程序指令总结
  6. 1.2 数学符号-深度学习第五课《序列模型》-Stanford吴恩达教授
  7. 0.0 目录-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  8. 3.7 感知器-机器学习笔记-斯坦福吴恩达教授
  9. STM32 基础系列教程 14 - IIC
  10. 查看DLL 及LIB 库导出函数方法