企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### Sleep sleep就是正在执行的线程主动让出CPU,CPU去执行其他线程,在sleep指定的时间过后,CPU才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了CPU,但其他被同步锁挡住了的线程也无法得到执行 ### 响应终端 Thread.sleep支持响应中断,并且在发现中断时提前返回; ``` public class Appliction { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { try { TimeUnit.SECONDS.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.err.println(Thread.currentThread().getName() + " canceled==>"); }); thread.start(); TimeUnit.SECONDS.sleep(3); thread.interrupt(); System.err.println(Thread.currentThread().getName() + " end==>"); } } ``` ### 总结 * Thread.sleep\(1000\),1000ms后是否立即执行? 不一定,在未来的1000毫秒内,线程不想再参与到CPU竞争。那么1000毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的,直到那个线程挂起或结束;况且,即使这个时候恰巧轮到操作系统进行CPU 分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去 * Thread.sleep\(0\),是否有用? Thread.Sleep\(0\)的作用,就是“触发操作系统立刻重新进行一次CPU竞争,重新计算优先级”。竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。这也是我们在大循环里面经常会写一句Thread.sleep\(0\) ,因为这样就给了其他线程比如Paint线程获得CPU控制权的权力,这样界面就不会假死在那里 * wait和sleep区别 > 1. sleep是Thread的方法,wait是Object的方法 > 2. wait会释放锁,如果在同步锁类sleep内不释放锁 > 3. sleep是休眠,wait是挂起 > 4. wait唤醒需要用notify或者notifyAll > 5. 而sleep则是休眠一段时间自己就恢复 > 6. wait方法需要在synchronize块或者synchronize方法里调用,然而sleep不需要 > 7. 如果需要线程停顿,使用sleep;使用wait进行线程间的通信\(implement inter-thread communication use wait method\) > 8. sleep必须捕获异常,而wait不需要捕获异常