Java 多线程基础(七)线程休眠 sleep
Java 多线程基础(七)线程休眠 sleep
一、线程休眠 sleep
sleep() 方法定义在Thread.java中,是 static 修饰的静态方法。
sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。
二、sleep示例
public class SleepTest {
private static Object obj = new Object();
public static void main(String[] args) {
Thread t1 = new MyThread("t1");
t1.start();
}
static class MyThread extends Thread{
public MyThread(String name) {
super(name);
}
public void run() {
synchronized (obj) {
try {
for(int i = 0;i < 5;i++) {
System.out.println(Thread.currentThread().getName() + "--" + i);
if (i % 4 == 0)
Thread.sleep(1000);// i能被4整除时,休眠1秒
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
}
// 运行结果
t1--0
t1--1
t1--2
t1--3
t1--4
说明:
在主线程main中启动线程t1。t1启动之后,当t1中的计算i能被4整除时,t1会通过Thread.sleep(100)休眠100毫秒。
三、sleep(long millis) 与 wait(long timeout)
我们知道,wait()的作用是让当前线程由“运行状态”进入“等待(阻塞)状态”的同时,也会释放同步锁。而sleep()的作用是也是让当前线程由“运行状态”进入到“休眠(阻塞)状态”。
但是,wait() 会释放对象的同步锁,而 sleep() 则不会释放锁。
通过下面的代码,演示 sleep() 不会释放锁的:
public class SleepTest {
private static Object obj = new Object();
public static void main(String[] args) {
Thread t1 = new MyThread("t1");
Thread t2 = new MyThread("t2");
t1.start();
t2.start();
}
static class MyThread extends Thread{
public MyThread(String name) {
super(name);
}
public void run() {
synchronized (obj) {
try {
for(int i = 0;i < 5;i++) {
System.out.println(Thread.currentThread().getName() + "--" + i);
Thread.sleep(1000);// 休眠1秒
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
}
// 执行结果
t1--0
t1--1
t1--2
t1--3
t1--4
t2--0
t2--1
t2--2
t2--3
t2--4
说明:
主线程main中启动了两个线程t1和t2。t1和t2在run()会引用同一个对象的同步锁,即synchronized(obj)。在t1运行过程中,虽然它会调用Thread.sleep(1000) 进入休眠状态;但是,t2是不会获取CPU执行权的。因为,t1并没有释放“obj所持有的同步锁”!
注意,若我们注释掉 synchronized (obj) 后再次执行该程序,t1和t2是可以相互切换执行的,原因是:在没有同步锁的情况下,当一个线程进入“休眠(阻塞)状态“时,会放弃CPU的执行权,另一个线程就会获取CPU执行权。
通过下面的代码,演示 wait() 会释放锁的:
public class SleepTest {
private static Object obj = new Object();
public static void main(String[] args) {
Thread t1 = new MyThread("t1");
Thread t2 = new MyThread("t2");
t1.start();
t2.start();
}
static class MyThread extends Thread{
public MyThread(String name) {
super(name);
}
public void run() {
synchronized (obj) {
try {
for(int i = 0;i < 5;i++) {
System.out.println(Thread.currentThread().getName() + "--" + i);
obj.wait(1000);// 等待1秒
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
}
// 执行结果
t1--0
t2--0
t1--1
t2--1
t2--2
t1--2
t2--3
t1--3
t2--4
t1--4
说明:
主线程main中启动了两个线程t1和t2。t1和t2在run()会引用同一个对象的同步锁,即synchronized(obj)。在t1运行过程中,调用 obj.wait(1000) 进入等待状态,释放同步锁;此时,t2会获取CPU执行权的。
Java 多线程基础(七)线程休眠 sleep的更多相关文章
- JAVA多线程学习七-线程池
为什么用线程池 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率 例如: 记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3 如果T1+T3> ...
- Java多线程基础知识总结
2016-07-18 15:40:51 Java 多线程基础 1. 线程和进程 1.1 进程的概念 进程是表示资源分配的基本单位,又是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程, ...
- “全栈2019”Java多线程第七章:等待线程死亡join()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java 多线程基础(五)线程同步
Java 多线程基础(五)线程同步 当我们使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,就容易出现线程安全问题. 要解决上述多线程并发访问一个资源的安全性问题,Java中提供了同步机制 ...
- Java 多线程基础(六)线程等待与唤醒
Java 多线程基础(六)线程等待与唤醒 遇到这样一个场景,当某线程里面的逻辑需要等待异步处理结果返回后才能继续执行.或者说想要把一个异步的操作封装成一个同步的过程.这里就用到了线程等待唤醒机制. 一 ...
- Java 多线程基础(十)interrupt()和线程终止方式
Java 多线程基础(十)interrupt()和线程终止方式 一.interrupt() 介绍 interrupt() 定义在 Thread 类中,作用是中断本线程. 本线程中断自己是被允许的:其它 ...
- Java多线程基础:进程和线程之由来
转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...
- 1、Java多线程基础:进程和线程之由来
Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...
- Java 多线程基础(四)线程安全
Java 多线程基础(四)线程安全 在多线程环境下,如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线 ...
随机推荐
- MySQL8多实例安装与mycat连接,最详细版本。
[版权所有,转载请注明出处!违者必究!] 最近在搞mycat去实现主从库读写分离,所以博主就在自己的windows机器上进行了环境的搭建,在搭建MySQL多实例的时候还算顺利,就是mysql8和myc ...
- Java基础语法--java中字符串比较中的坑点
Java 中两个字符串比较大小,可以有两种方式判定,要根据需求选择 == 判定,比较的是两个字符串的内存地址,地址相同则判定为true:反之则反 equals() 判定,比较的是两个字符串的内容,内容 ...
- String与包装类_字节数组_字符数组间的转换
1.字符串与基本数据类型,包装类之间的转换 2.字符串与字节数组间的转换 3.字符串与字符数组间的转换 4.String与StringBuffer ①String---->StringBuffe ...
- Rocket - tilelink - mask
https://mp.weixin.qq.com/s/Gqv09RIgSSg5VKe-wb4aGg 讨论tilelink中使用MaskGen生成mask的用法. 1. tilelink中的ma ...
- Rocket - util - LanePositionedQueue
https://mp.weixin.qq.com/s/yO_9Ec3S5-AosRVLpsBgOg 简单介绍基于通道位置的队列(LanePositionedQueue)的实现. 1. ...
- 数字电路建模 - jchdl
https://mp.weixin.qq.com/s/uWU6i30_q7wJT3yVJ8yqnQ jchdl:Jianchang Constructed Hardware Description ...
- jchdl - GSL实例 - DLatch(D锁存器)
https://mp.weixin.qq.com/s/c8kDgye50nKJR4tkC0RzVA D锁存器对电平敏感,当使能位使能时,输出Q跟随输入D的变化而变化. 摘自康华光<电子 ...
- 【Linux】CentOS7中使用mysql,查询结果显示中文乱码的解决办法
1.登录mysql mysql -u root -p 2.查看mysql字符集 mysql> show variables like 'chara%'; mysql> show varia ...
- Spring Boot笔记(七) springboot 集成 JavaMail 实现邮箱认证
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.JavaMail 1.什么是JavaMail? JavaMail,顾名思义,提供给开发者处理 电子邮 ...
- Java并发编程 (三) 项目准备
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.案例环境初始化 1.环境搭建与准备 Spring Boot 项目,https://start.spr ...