首页 » 网站建设 » php多线程sleep技巧_你能说出多线程中sleepyieldjoin的用法及sleep与wait差异

php多线程sleep技巧_你能说出多线程中sleepyieldjoin的用法及sleep与wait差异

访客 2024-11-13 0

扫一扫用手机浏览

文章目录 [+]

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

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

php多线程sleep技巧_你能说出多线程中sleepyieldjoin的用法及sleep与wait差异

sleep方法

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

php多线程sleep技巧_你能说出多线程中sleepyieldjoin的用法及sleep与wait差异
(图片来自网络侵删)

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

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

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

把稳:

sleep不会开释锁,不会开释锁,不会开释锁

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

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

以是对付sleep方法,要么自己醒来,要么被中断后也会醒来

对付sleep始终有一个超时时间的设置,以是,只管他是在监视器内睡着了,但是并不会导致去世锁,由于他究竟是要醒来的

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

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

借助于sleep方法,可以仿照线程的顺序实行

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

其余,你该当已经把稳到sleep方法都有static润色,既然是静态方法,在Thread中的老例便是针对付:当前哨程,当前哨程,当前哨程

yield方法

对付sleep或者wait方法,他们都将进入特定的状态,伴随着状态的切换,也就意味着等待某些条件的发生,才能够连续,比如条件知足,或者到韶光等

但是yield方法不涉及这些事情,他针对的是韶光片的划分与调度,以是对开拓者来说只是临时让一下,让一下他又不会去世,就只是再等等

yield方法将会暂停当前正在实行的线程工具,并实行其它线程,他始终都是RUNNABLE状态

不过要把稳,可以认为yield只是一种建议性的,如果调用了yield方法,对CPU韶光片的分配进行了“礼让”,它仍旧有可能连续得到韶光片,并且连续实行

以是一次调用yield 并不一定会代表肯定会发生什么

借助于while循环以及yield方法,可以看得出来,也能一定程度上达到线程排序等待的效果

yield也是静态方法,以是,也是针对付当前哨程,当前哨程,当前哨程。

join方法

三个版本的join方法

方法的实现过程,与wait也是非常类似,下面两个版本的方法一个调用join(0),一个参数校验后,调用join(millis),以是根本还是单参数版本的join方法

在方法深入先容前先看个例子

一个线程,循环5次,每次sleep 1s,主线程中打印信息

从结果可以看到,主线程总是在线程实行之后,才会实行,也便是主线程在等待我们创建的这个线程结束,结束了之后才会连续进行

如果调度下顺序--->start 与 join的先后顺序,再次看下情形,可以创造顺序没有保障了

结论:

主线程main中调用启动线程(调用start),然后调用该线程的join方法,可以达到主线程等待事情线程运行结束才实行的效果,并且join要在start调用后

如何做到的?

从上面源代码可以看得出来,内部调用了wait方法,以是也能明白为啥join也会抛出InterruptedException了吧

主线程main中调用thread.join()方法,join方法相称于join(0),也便是

while (isAlive()) {

wait(0);

}

而这个wait(0)就相称于是this.wait(0),this便是我们自己创建的那个线程thread,看看方法的署名是不是有一个synchronized

isAlive()也是this.isAlive(),也便是如果当前哨程alive(已经启动,但是未终止),那么将持续等待,等待的临界资源便是我们创建的这个线程工具本身

以是这两行代码的含义便是:

该线程是否还存活?如果存活,调用join的那个线程将会在这个工具上进行等待(进入该线程工具的等待集)

也便是说调用一个线程的join方法,便是在这个线程是等待,这个线程工具便是我们的锁工具(不要迷惑,Object都可以作为锁,Thread实例工具怎么不可以?)

肯定大家很奇怪,既然是等待,wait又不会自己醒来,那不是出问题了吗?

实在线程结束后,会调用this.notifyAll,以是主线程main会被唤醒

如果通报的参数不为0,将会走到下面的分支,或wait指定时长,与上面的逻辑同等,只不过是有指定超时时长而已

long delay = millis - now;

if (delay <= 0) {

break;

}

wait(delay);

now = System.currentTimeMillis() - base;

手动版本的等待结束

只是将join方法换成了同步代码块,锁工具为那个线程的实例工具thread,调用他的wait方法

从结果上看,效果一样

(不过此处没有持续监测isAlive(),以是一旦主线程醒来,纵然线程没有结束,也会连续,不能百分百确保main肯定等待线程结束)

不过要把稳:注释中有解释,自己不要利用Thread类的实例工具作为锁工具,如果是现在这种场景,利用join即可

为什么?从我们目前来看,join方法便是以这个工具为锁,如果你自己在利用,又是wait又是notify(notifyAll)的,万一涌现什么隐匿的问题咋办?

以是join方法的事理便是:将指定的Thread实例工具作为锁工具,在其上进行同步,只要那个线程还活着,那么就会持续等待(或者有限时长)

线程终止之后会调用自身this.notifyAll,以关照在其上等待的线程

大略说,只要他活着大家就都等着, 他去世了会关照,以是效果便是在哪里调用了谁的join,哪里就要等待这个线程结束,才能连续

为什么要在start之后?

如上面所示,将join改造成同步代码块如下所示,如果这段同步代码在start方法之前

看下结果,没有等待指定线程结束,main主线程就结束了

由于如果还没有调用start方法,那么isAlive是false(已开始未结束),主线程根本就不会等待,以是连续实行,然后连续到下面的start,然后主线程结束

以是,为什么join方法一定要在start之前?

便是由于这个isAlive方法的校验,你没有start,isAlive便是false,就不会同步等待,以是必须要先start,然后才能join

小结:

对付join方法,有两个关键:

调用的哪个工具的join?在哪里调用的?

换一个说法:join的效果是:一个线程等待另一个线程(直到结束或者持续一段韶光)才实行,那么谁等待谁?

在哪个线程调用,哪个线程就会等待;调用的哪个Thread工具,就会等待哪个线程结束;

状态图回顾

在回顾下之前状态一文中的切换图,又理解了这几个方法后,该当对状态切换有了更全面的认识

总结

对付yield方法,比较随意马虎理解,只是大略地对付CPU韶光片的“礼让”,除非循环yield,否则一次yield,可能下次该线程仍旧可能会抢占到CPU韶光片,可能方法调用和不调用没差别

sleep是静态方法,针对当前哨程,进入休眠状态,两个版本的sleep方法始终有韶光参数,以是一定会在指定的韶光内清醒,他也不会开释锁,当然,sleep方法的调用非必须在同步方法(同步代码块)内

join是实例方法,表示等待谁,是用于线程顺序的调度方法,可以做到一个线程等待其余一个线程,join有三个版本,指定超时时间或者持续等待直到目标线程实行结束,join也无需在同步方法(同步代码块)内

sleep和join都是可中断方法,被其他线程中断时,都会抛出InterruptedException非常,并且会醒来

join方法底层依赖wait,我们比拟下wait与sleep

wait和sleep都会使线程进入壅塞状态,都是可中断方法,被中断后都会抛出非常wait是Object的方法,sleep是Thread的方法wait必须在同步中实行,sleep不须要(join底层依赖wait,但是不须要在同步中,由于join方法便是synchronized的)wait会开释锁,sleep不会开释锁wait(无超时设置的版本)会持续壅塞,必须等待唤醒,而sleep一定有超时,以是一定会自己醒来wait 实例方法(Object),在工具上调用,表示在其上等待;sleep静态方法,当前哨程
标签:

相关文章

PHP实现文字转图片的代码与应用

图片处理技术在各个领域得到了广泛应用。在PHP编程中,文字转图片功能同样具有很高的实用价值。本文将针对PHP实现文字转图片的代码进...

网站建设 2025-03-02 阅读1 评论0

NAN0017探索新型纳米材料的奥秘与应用

纳米技术作为一门新兴的交叉学科,近年来在材料科学、生物医学、电子工程等领域取得了举世瞩目的成果。其中,NAN0017作为一种新型纳...

网站建设 2025-03-02 阅读3 评论0

L26368XO代码其背后的创新与突破

编程语言在各个领域发挥着越来越重要的作用。在众多编程语言中,L26368XO代码以其独特的优势,成为了业界关注的焦点。本文将深入剖...

网站建设 2025-03-02 阅读1 评论0

HTML字体背景打造个化网页设计的关键元素

网页设计已经成为现代网络传播的重要手段。在众多网页设计元素中,字体和背景的搭配尤为关键。本文将从HTML字体背景设置的角度,探讨其...

网站建设 2025-03-02 阅读1 评论0