java中的wait和sleep_java中wait和sleep的区别
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的区别相关推荐
- 使用java中replaceAll方法替换字符串中的反斜杠
今天在项目中使用java中replaceAll方法将字符串中的反斜杠("\")替换成空字符串(""),结果出现如下的异常: 1 java.util.regex. ...
- java super是引用变量吗_Java中super的几种用法并与this的区别
1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base" ...
- java中super用来定义父类,Java中super的几种用法及与this的区别
综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺 ...
- java中组件与容器_java中的容器组件和非容器组件
1.java使用到的图形类主要在java.awt 与javax.swing包中. 2.java.awt 与 javax.swing包的区别: ① java.awt中使用的图形类都是依赖于系统的图形库的 ...
- java interface class_java interface和class中的协变
协变 Java中的协变是指,当发生继承时,子类中重写父类的方法时,可以返回父类方法返回类型的子类型.比如: class SuperClass{} class SubClass extends Supe ...
- java boolean几个字节_Java中boolean类型到底占用多少个字节?
1.时间:2017-07-03 07:37:06YuanMxy 2.问题描述:今天在复习java基础的时候发现一小问题,Java中boolean类型到底占用多少个字节? 3.问题解答: (1)什么是b ...
- java主线程捕获子线程中的异常
java主线程捕获子线程中的异常 参考文章: (1)java主线程捕获子线程中的异常 (2)https://www.cnblogs.com/jpfss/p/10272726.html (3)https ...
- java 基本类型的引用_Java中的基本数据类型与引用数据类型
一.基本数据类型 byte.short.int.long(整数类型) float.double(浮点数类型) char(字符型) boolean(布尔类型 ) Java数据大多数存放在堆栈中.栈区:存 ...
- java对于数组的定义_Java中方法的定义与使用,以及对数组的初步了解。
方法 方法的含义 定义: 方法就是用来完成解决某件事情或实现某个功能的办法. 方法实现的过程中,会包含很多条语句用于完成某些有意义的功能--通常是处理文本,控制输入或计算数值. 我们可以通过在程序代码 ...
最新文章
- 非单身勿点,这里是单身汪专属情人节~
- 泰晤士高等教育2020年新兴经济体大学排名出炉,81所中国大陆高校上榜!
- If-Modified-Since和If-None-Match
- PYG教程【五】链路预测
- Android当中layer-list使用来实现多个图层堆叠到一块儿
- ubuntu创建新用户并设置sudo权限
- mysql sql语句书写之面试部分
- 谷歌浏览器如何将繁体字设置成中文?
- java -jar 内存溢出_JAVA系统启动栈内存溢出-StackOverflowError
- MySQL学习-连接查询
- 转化率高的爆款文案都是如何写出来的?
- 美赛整理之带参数的常微分方程拟合问题研究
- python培训 首选马哥教育
- python下载所有 XKCD 漫画
- SAP ABAP STANDARD TABLE,SORTED TABLE和HASHED TABLE简介
- Python 刷题笔记:背包问题
- 大数据分析笔记 (2) - 数据分析统计方法
- Evolutionary Acyclic Graph Partition
- 公司邮箱如何申请?如何申请公司邮箱?公司邮箱号码大全
- 2020年7月指数定期审核与调整 | TokenInsight
热门文章
- android source镜像源_说要替代安卓的Fuchsia OS,国内镜像上线了!
- 用反向传导模拟电子运动并模拟HF,HCl,HBr
- MIT_18.03_微分方程_Laplace_Transform_拉普拉斯变换_Notes
- 【数理知识】《矩阵论》方保镕老师-第3章-矩阵的分解
- P12 离散控制系统-《Matlab/Simulink与控制系统仿真》程序指令总结
- 1.2 数学符号-深度学习第五课《序列模型》-Stanford吴恩达教授
- 0.0 目录-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
- 3.7 感知器-机器学习笔记-斯坦福吴恩达教授
- STM32 基础系列教程 14 - IIC
- 查看DLL 及LIB 库导出函数方法