sleep和wait的区别面试题,
如何解决写爬虫IP受阻的问题?立即使用。
我们先介绍一下锁池和等待池的概念。
我们先来看看锁池的概念。
所有需要竞争同步锁的线程都将被放在锁池中。例如,如果当前对象的锁已经被一个线程获得,其他线程需要在这个锁池中等待。当前一个线程释放同步锁,等待锁池中的线程竞争同步锁时,一个线程会进入就绪队列等待cpu资源分配。
我们来看一下等待池的概念。
当我们调用wait()方法时,线程会被放在等待池中,等待池的线程不会竞争同步锁。只有在调用notify()或notifyAll()时,等待池的线程才会开始竞争锁。notify()从等待池中随机选择一个线程放入锁池,而notifyAll()将所有等待池的线程放入锁池。
Sleep是Thread类的静态局部方法,wait是Object的局部方法。
sleep方法不会释放锁,但是等待将被释放并添加到等待队列中。
睡眠就是释放cpu的执行资格和执行权,停止运行这个线程,在定时事件结束时取回cpu资源,参与cpu调度,获得cpu资源后继续运行。如果线程在睡眠期间有锁,那么睡眠不会释放这个锁,而是将锁带入冻结状态,也就是说其他需要这个锁的线程根本无法获得这个锁。也就是说程序无法执行。如果其他线程在睡眠期间调用该线程的中断方法,该线程也会抛出interruptexception返回,与wait相同。sleep方法不依赖于synchronized的同步器,但是wait依赖于synchronized关键字。
Sleep不需要唤醒(睡眠后退出区块),wait需要(不指定时间需要被别人打断)。
Sleep一般用于当前线程休眠,或者轮询暂停操作,而wait则多用于多个线程之间的通信。
Sleep会放弃CPU执行时间,强制上下文切换,wait就不一定了。等待之后,可能还有机会重新竞争锁继续执行。
yield()执行后,线程直接进入就绪状态,立即释放cpu的执行权,但仍保留cpu的执行资格,所以有可能下一次cpu调度线程时,线程会获得执行权,继续执行。
(学习视频分享:java视频教程)
执行join()后,线程进入阻塞状态。例如,如果线程A的join()在线程B中被调用,那么线程B将进入阻塞队列,并指示线程A结束或中断该线程。
公共静态void main(String[] args)引发InterruptedException {
线程t1=新线程(()-{
尝试{
thread . sleep(4000);
} catch (InterruptedException e) {
e . printstacktrace();
}
System.out.println(睡眠线程);
});
t1 . start();
t1 . join();
System.out.println(“线程执行完成”);
}原文链接:https://blog.csdn.net/lxn1023143182/article/details/114134498
推荐:java面试问答。以上是面试官:请详细说说sleep()、wait()、join()和yield()的区别。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。