每日三道面试题,通往自由的道路8——多线程 (2)

在创建对象对象完成后,调用了myThread.start()方法线程,可以在Java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器。也可以叫做处于就绪状态,需要等待被线程调度选中,获取cpu资源的使用权。

Teminated(被终止)

因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。代表着此线程的生命周期结束了。

处于运行状态中的线程由于某种原因,暂时放弃对 CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被 CPU 调用以进入到运行状态。有以下三种相关阻塞状态:

Blocked(锁阻塞)

当一个线程试图获取一个对象锁如(Synchronzied或Lock),而该对象锁被其他的线程持有,则该线程进入Blocked状态;只有当该线程持有锁时,该线程将变成Runnable状态。

Waiting(无限等待)

在调用了wait方法,JVM会把该线程放入等待队列中,等待另一个线程执行一个(唤醒),该线程此时状态表示进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。

TimedWaiting(计时等待)

同waiting状态一样,调用sleep方法或者其他超时方法时,他们将进入Timed Waiting状态。不过这一状态只需保持到超时期满或者接收到唤醒通知。

每日三道面试题,通往自由的道路8——多线程

可以,那问你最后一道:

3. 既然讲到超时方法,那你讲下sleep和wait的区别和他们需要怎样唤醒

sleep和wait方法他们都是可以暂停当前线程的执行,进入一个阻塞状态。

sleep:

我们可以指定睡眠时间,即让程序暂停指定时间运行,时间到了会继续执行代码,如果时间未到我们想要换醒需要调用interrupt 方法来随时唤醒即可。而调用interrupt 会使得sleep()方法抛出InterruptedException 异常,当sleep()方法抛出异常我们就中断了sleep的方法,从而让程序继续运行下去。

wait:

调用该方法,可以导致线程进入等待阻塞状态,会一直等待直到它被其他线程通过notify或者notifyAll方法唤醒。或者也可以使用wait(long timeout)表示时间到了自动执行,类似于sleep(long millis)。

notify():该方法会随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态。

notifyAll():该方法会唤醒所有的wait对象。

两者的区别:

两者所属的类不同:sleep是 Thread线程类的静态方法;而wait是 Object类的方法。

两者是否是否锁呢:sleep不释放锁;wait释放锁。

两者所使用的场景:sleep可以在任何需要的场景下调用;而wait必须使用在同步代码块或者同步方法中。

两者不同唤醒机制:sleep方法执行睡眠时间完成后,线程会自动苏醒;而wait方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify或者 notifyAll方法,或者可以使用wait(long timeout)超时后线程会自动苏醒。

小伙子不错嘛!今天就到这里,期待你明天的到来,希望能让我继续保持惊喜!

注: 如果文章有任何错误和建议,请各位大佬尽情留言!如果这篇文章对你也有所帮助,希望可爱亲切的您给个三连关注下,非常感谢啦!

每日三道面试题,通往自由的道路8——多线程

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjspz.html