前言
讨论这个问题前,需要先了解以下知识点!
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 区别和联系(一)

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

被折叠的 条评论
为什么被折叠?



