线程中sleep()方法和wait()方法的前生今世
先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索【程序职场】关注这个执着的职场程序员。
我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验。
不知道大家有没有这种感觉,在公司项目忙碌的时候,有时候感觉又忙又累,甚至加班通宵都有,能忙死人,每天想着轻松点吧,能休息休息做点别的什么。
但是当项目收尾不忙(不忙是指不用加班)的时候,如果一天两天还好,但是时间超出一周(不是没事干,是不像之前每天加班才能完成任务,现在每天8个小时不到就完成了任务),总是感觉太闲了,不太充实了,不知道该干什么。这边找点事,那边找点事
有时候甚至想着还是忙点吧。
所以趁着最近几天不是太忙,对自己做了一个复盘,发现我计划的东西还有一半没有完成(比如:我读的书 和 写的教程还只是做到2/1),所以还要加油,更主要的是 公众号文章的更新以后要保持下去。
好了不发感慨了,开始我们今天的线程篇(这些文章目前已经做了分类,多了就能成系统了)。
1,sleep和wait概念
Java中的多线程是一种抢占式的机制。
线程主要有以下几种状态:可运行,运行,阻塞,死亡。抢占式机制指有多个线程处于可运行状态,但是只有一个线程在运行。
当有多个线程访问共享数据的时候,就需要对线程进行同步。线程中的几个主要方法的比较:
Thread类的方法:sleep(),yield()等
Object的方法:wait()和notify()等
每个对象都有一个机锁来控制同步访问。Synchronized关键字可以和对象的机锁交互,来实现线程的同步。
由于sleep()方法是Thread类的方法,因此它不能改变对象的机锁
Wait()方法和notify()方法:当一个线程执行到wait()方法时(线程休眠且释放机锁),它就进入到一个和该对象相关的等待池中,同时失去了对象的机锁。
当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中。该线程从锁池中获得机锁,然后回到wait()前的中断现场。
共同点: 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
不同点: Thread.sleep(long)可以不在synchronized的块下调用,而且使用Thread.sleep()不会丢失当前线程对任何对象的同步锁(monitor);
object.wait(long)必须在synchronized的块下来使用,调用了之后失去对object的monitor, 这样做的好处是它不影响其它的线程对object进行操作。
2. sleep和wait方法的应用场景
sleep 休眠方法:
Static void sleep(long ms)
该方法会使当前线程进入阻塞状态指定毫秒,当阻塞指定毫秒后,当前线程会重新进入Runnable状态,等待划分时间片。
wait方法一般是跟notify方法连用的:
多线程之间需要协调工作。如果条件不满足则等待。当条件满足时,等待该条件的线程将被唤醒。在Java中,这个机制实现依赖于wait/notify。
3,简单使用
一,Sleep()
Sleep方法属于Thread类,调用Sleep时会暂停此线程指定的时间,但它的监控一直在监控着,Sleep不会释放对象的锁,到了一定时间它会自动唤醒。
Sleep方法有接收时间参数,Therad.Sleep(1000) 其中参数都是毫秒值。
public class ThreadSleep {public static void main(String[] args) {// write your code hereint time = 10;for (int i=1;i<=time;i++) {
try {
Thread.sleep(1000);
System.out.println("线程休眠时间=" + i +"秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}}
上面的代码循环中间隔一秒输出一个信息。
线程休眠时间=1秒
线程休眠时间=2秒
线程休眠时间=3秒
线程休眠时间=4秒
线程休眠时间=5秒
线程休眠时间=6秒
线程休眠时间=7秒
线程休眠时间=8秒
线程休眠时间=9秒
线程休眠时间=10秒
Process finished with exit code 0
二,Wait()
1.Wait()方法属于Object类,调用Wait方法时,线程会放弃对象锁,进入等待此对象的等待锁定池,只有此对象调用notify()方法后本线程才进入对象锁定池准备,wait方法需要被动唤醒,
2. wait方法不需要时间参数
public class ThreadWait {public static void main(String[] args) {
/*** 作者:公众号:程序职场* 代码描述:创建两个线程一个操作年龄的信息,一个是工作量的信息*/
//输出年龄信息
Object obj=new Object();
Thread download=new Thread(){
public void run() {
System.out.println("开始输出年龄");
for (int i = 1; i < 6; i+=1) {
System.out.println("年龄="+i);
}
System.out.println("年龄输出成功");
synchronized (obj) {
System.out.println("唤起");
obj.notify();//唤起wait的等待
}
System.out.println("开始输出工作量");
for (int i = 1; i < 6; i+=1) {
System.out.println("工作量="+i+"小时");
}
System.out.println("工作量输出成功");
}
};//2.年龄输出成果的结果
Thread show=new Thread(){
public void run(){
synchronized (obj) {
try {
System.out.println("阻塞");
obj.wait();//阻塞当前
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("年龄完成");
}
}
};
download.start();
show.start();
}}
1,show线程中阻塞线程(wait)
2,download线程中 唤醒(notify)
本文 Github ( 码云Gitee同步) https://github.com/ProceduralZC/JavaDevGuide/tree/master/code/JavaTheead/ThreadClass 已收录,欢迎 star。
我是【尔东双月】一枚执着的职场程序员,微信搜索【程序职场】关注我。别忘了三连啊,点赞、收藏、留言,随意给,我不挑。
知乎号: 程序职场
注:如果文章有任何问题,欢迎毫不留情地指正。
线程中sleep()方法和wait()方法的前生今世的更多相关文章
- 线程中sleep方法和wait方法有什么区别?(转)
本文转自https://www.cnblogs.com/linkstar/p/6043846.html 线程中sleep方法和wait方法有什么区别? 如果你没有接触过java的多线程,那么多对于 ...
- 线程中sleep方法和wait方法有什么区别?
如果你没有接触过java的多线程,那么多对于这两个方法可能有点陌生,看名字好像这两个方法是差不多的,但是实际上面差别好大. 首先我们看一下官方的API Sleep(sleep有两个方法,另一个方法传递 ...
- Hibernate中evict方法和clear方法说明
Hibernate中evict方法和clear方法说明 先创建一个对象,然后调用session.save方法,然后调用evict方法把该对象清除出缓存,最后提交事务.结果报错: Exception i ...
- Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? 线程的sleep()方法和yield()方法有什么区别?
Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间 ...
- ThinkPHP 中M方法和D方法详解----转载
转载的地址,http://blog.163.com/litianyichuanqi@126/blog/static/115979441201223043452383/ 自己学到这里的时候,不能清除的分 ...
- ThinkPHP 中M方法和D方法的具体区别(转)
M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...
- ThinkPHP 中M方法和D方法的具体区别
M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...
- jquery中prop()方法和attr()方法
接着上一篇笔记的疑惑,找了下prop()方法和attr()方法的区别. 原来query1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. ...
- js进阶 12-13 jquery中one方法和trigger方法如何使用
js进阶 12-13 jquery中one方法和trigger方法如何使用 一.总结 一句话总结: 1.one()方法和on()方法的区别是什么? 除了one()只执行一次,其它和on()一模一样,包 ...
随机推荐
- 程序"三高"解决方案
0. 程序三高 1. 缓存 2. 预处理和延后处理 3. 池化 3.1 内存池 3.2 线程池 3.3 连接池 4. 异步(回调) 5. 消息队列 5.1 服务解耦 5.2 异步处理 5.3 流量削峰 ...
- yml配置从nacos配置中心取数据(单个或多个)
读取单个文件 spring: application: name: test-server cloud: nacos: config: server-addr: localhost:8848 name ...
- LIN总线多从机与主机通信(控制+反馈)
概念 首先要明确以下两点: LIN 总线通信方式为主从机通信,属于异步通信 "帧头 + 数据帧"才算一完整报文 设计方案 多从机与主机通信数据流(控制+反馈)如下: 一号从机: 第 ...
- 韩小韩 API接口
官方网址:https://api.vvhan.com/ 天气API接口: https://api.vvhan.com/api/weather Bing每日图片API接口: https://api.vv ...
- Jmeter- 笔记11 - 持续集成
CICD:持续集成 持续交付 进行持续集成的首选工具:Jenkins 性能测试中持续集成:Jenkins(管理集成) + Jmeter(性能工具) + ant(编译代码) ant安装配置步骤: 1.下 ...
- 视觉SLAM技术应用
视觉SLAM技术应用 SLAM技术背景 SLAM技术全称Simultaneous localization and mapping,中文为"同时定位与地图构建".SLAM可以在未知 ...
- MindSpore部署图像分割示例程序
MindSpore部署图像分割示例程序 本端侧图像分割Android示例程序使用Java实现,Java层主要通过Android Camera 2 API实现摄像头获取图像帧,进行相应的图像处理,之后调 ...
- Win10 下python_appium的Android手机自动化环境搭建
前提: 已经安装好了Java环境,且配置了环境变量 已经安装python3.8.2,已经安装pycham. 一.安装appium_client ,pycham中也需要安装 二.安装node.js(需要 ...
- Python基础_python的数据类型
一.Python 的标准数据类型 二.以下单个实际举例分析数据类型 2.1 python的数字类型 Int:整型,Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python ...
- 【Android编程】Java利用apktool编写Metasploit恶意后门注入工具
/声明:本文作者Kali_MG1937 csdn博客id:ALDYS4 QQ:3496925334 未经许可禁止转载!/ 注意,本文为作者从CSDN搬迁至此的文章 注意!此文章虽然 未被 作者标记到 ...