公司网站规划,网店怎么开大概需要多少钱,做店铺首页的网站,电子商务网站建设基本步骤笔试题#xff1a;画出线程的生命周期#xff0c;各个状态的转换。 5.等待队列(本是Object里的方法#xff0c;但影响了线程)
调用obj的wait(), notify()方法前#xff0c;必须获得obj锁#xff0c;也就是必须写在synchronized(obj) 代码段内。与等待队列相关的步骤和图 …笔试题画出线程的生命周期各个状态的转换。 5.等待队列(本是Object里的方法但影响了线程)
调用obj的wait(), notify()方法前必须获得obj锁也就是必须写在synchronized(obj) 代码段内。与等待队列相关的步骤和图
线程1获取对象A的锁正在使用对象A。线程1调用对象A的wait()方法。线程1释放对象A的锁并马上进入等待队列。锁池里面的对象争抢对象A的锁。线程5获得对象A的锁进入synchronized块使用对象A。线程5调用对象A的notifyAll()方法唤醒所有线程所有线程进入锁池。||||| 线程5调用对象A的notify()方法唤醒一个线程不知道会唤醒谁被唤醒的那个线程进入锁池。notifyAll()方法所在synchronized结束线程5释放对象A的锁。锁池里面的线程争抢对象锁但线程1什么时候能抢到就不知道了。||||| 原本锁池第6步被唤醒的线程一起争抢对象锁。 6锁池状态
当前线程想调用对象A的同步方法时发现对象A的锁被别的线程占有此时当前线程进入锁池状态。简言之锁池里面放的都是想争夺对象锁的线程。当一个线程1被另外一个线程2唤醒时1线程进入锁池状态去争夺对象锁。锁池是在同步的环境下才有的概念一个对象对应一个锁池。
7死亡状态(Dead) 有两个原因会导致线程死亡 1) run方法正常退出而自然死亡 2) 一个未捕获的异常终止了run方法而使线程猝死。 为了确定线程在当前是否存活着就是要么是可运行的要么是被阻塞了需要使用isAlive方法。如果是可运行或被阻塞这个方法返回true 如果线程仍旧是new状态且不是可运行的 或者线程死亡了则返回false. 几个方法的比较
Thread.sleep(long millis)一定是当前线程调用此方法当前线程进入阻塞但不释放对象锁millis后线程自动苏醒进入可运行状态。作用给其它线程执行机会的最佳方式。Thread.yield()一定是当前线程调用此方法当前线程放弃获取的cpu时间片由运行状态变会可运行状态让OS再次选择线程。作用让相同优先级的线程轮流执行但并不保证一定会轮流执行。实际中无法保证yield()达到让步目的因为让步的线程还有可能被线程调度程序再次选中。Thread.yield()不会导致阻塞。t.join()/t.join(long millis)当前线程里调用其它线程1的join方法当前线程阻塞但不释放对象锁直到线程1执行完毕或者millis时间到当前线程进入可运行状态。obj.wait()当前线程调用对象的wait()方法当前线程释放对象锁进入等待队列。依靠notify()/notifyAll()唤醒或者wait(long timeout)timeout时间到自动唤醒。obj.notify()唤醒在此对象监视器上等待的单个线程选择是任意性的。notifyAll()唤醒在此对象监视器上等待的所有线程。 知识来源
【2023年面试】介绍线程的生命周期和状态_哔哩哔哩_bilibili
线程的5种状态详解_熊與猫v的博客-CSDN博客