多线程中 sleep、yield、join 的用法及 sleep与wait区别

本文详细介绍了Java多线程中sleep、yield、join方法的使用,包括它们的原理、特点和应用场景。强调了sleep不会释放锁,yield对时间片的礼让以及join实现线程顺序执行的机制。同时指出,sleep和wait虽都能使线程进入阻塞,但wait需在同步中执行并释放锁,而sleep则不释放锁。
摘要由CSDN通过智能技术生成

Object中的wait、notify、notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑

 

通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁(监视器)为中心的通信方法

 

除了他们之外,还有用于线程调度、控制的方法,他们是sleep、yield、join方法,他们可以用于线程的协作,他们是围绕着线程的调度而来的

 

sleep方法

 

有两个版本的sleep方法,看得出来,核心仍旧是native方法

 

非native方法只是进行了参数校验,接着仍旧是调用的native方法,这个情形与wait是类似的

 

 

接下来仔细看下,native版本的sleep

 

在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。

 

注意:

 

sleep不会释放锁,不会释放锁,不会释放锁,可以理解为他进入监视器这个房间之后,在这房间里面睡着了

 

与wait类似的是,sleep也是可中断方法(从方法签名可以看得出来,可能抛出InterruptedException),也就是说如果一个线程正在sleep,如果另外的线程将他中断(调用interrupt方法),将会抛出异常,并且中断状态将会擦除

 

所以对于sleep方法,要么自己醒来,要么被中断后也会醒来。扩展:多线程基础体系知识清单

 

对于sleep始终有一个超时时间的设置,所以,尽管他是在监视器内睡着了,但是并不会导致死锁,因为他终究是要醒来的

 

如下,线程休眠500毫秒,主线程50毫秒打印一次状态

ps:sleep方法的调用结果为状态:TIMED_WAITING

 

 

借助于sleep方法,可以模拟线程的顺序执行

 

比如下面示例,两个阶段,第二个阶段将在第一个阶段执行之后才会执行

 

package test1;
import java.lang.Thread.State;
public class T16 {
public static void main(String[] args) {
//模拟执行任务的第一个阶段的执行
Thread stepOne = new Thread(() -> {
System.out.println(Thread.currentThread().getName()+" : 第一阶段任务开始执行");
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+" : 第一阶段任务执行结束");
} catch (InterruptedExcep
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值