JAVA多线程:sleep(0)、sleep(1)、sleep(1000)的区别(四)

本文探讨了JAVA多线程中sleep(0)、sleep(1)和sleep(1000)的区别。sleep(0)不释放锁,会立即重新参与CPU竞争;sleep(1)短暂休眠后再次竞争;sleep(1000)则在1秒后才重新竞争。这些方法在多线程中用于控制执行顺序和资源调度。

前言

讨论这个问题前,需要先了解以下知识点!

1、等待/阻塞队列blocked)中的线程不参与cpu竞争,就绪队列(runable)中的线程才会参与cpu竞争。
2、CPU竞争策略有多种,Unix使用的是时间片算法,Windows属于抢占式。

a)时间片:
所有的进程排成一个队列。操作系统按照他们的顺序,给每个进程分配一段时间,即允许该进程运行的时间。

b)抢占式操作系统
就是说如果一个进程得到了 CPU 时间,除非它自己放弃使用 CPU ,否则将完全霸占 CPU 。因此可以看出,在抢 占式操作系统中,操作系统假设所有的进程都是“人品很好”的,会主动退出 CPU 。 

一、sleep(0)发生了什么

它会让操作系统就会重新计算队列中所有线程的优先级,其中本身也参与其中,并且有可能再次获取被CPU运行。
简单是说:它触发操作系统立刻按优先级,重新进行一次CPU竞争。

二、sleep(1)

它会在极短的1毫秒内进入睡眠(被放入等待队列中,进入等待状态,暂时放弃CPU竞争),1毫秒后立刻又再次参与CPU的竞争。

三、sleep(1000)

告诉操作系统:在未来的1000毫秒内不再参与到CPU竞争,1000毫秒后重新参与竞争,有可能竞争成功(因为有优先级的存在)。
在此1000毫秒内,线程被放入等待队列中,直到中间被打断或者结束1000毫秒后,才会进入就绪队列中,继续参与cpu竞争。

总结

三者都使用了参数,只是睡眠的时间长短不一样。如果单单从睡眠时间结束后的结果来看,三者的作用是一样的,都是不释放锁,都是睡醒后重新同其他线程竞争CPU的执行权,问题就出在0、1、1000,这段时间发生了什么。

0,意味着没有休息,离开进入下一轮的CPU执行权竞争中,可能竞争成功也可能失败。

1,是一样的,仅仅是休息1毫秒后,立刻进入下一轮的竞争,仅仅是在这1毫秒内进入了等待状态。

1000,相对于1,此时的1000就不难理解了,它仅仅是休息的时间(放弃竞争CPU执行权)的时间更长。

尾言

学好多线程,这些都是绕不过去的点,只能深挖后一个一个突破,加油!

猜你可能会对以下内容感兴趣:

1、JAVA多线程:synchronized理论和用法 | Lock和ReentrantLock Volatile 区别和联系(一)

2、JAVA多线程:yield/join/wait/notify/notifyAll等方法的作用(二)

3、 JAVA多线程:join()方法到底会不会释放锁,给你彻底介绍清楚(三)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值