首页 > 编程语言 > 详细

线程面试题

时间:2021-03-07 08:58:24      阅读:37      评论:0      收藏:0      [点我收藏+]

线程的生命周期和线程的几种状态

线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞和死亡状态。

 阻塞分为三种:

1.等待阻塞,运行的线程执行了object的wait方法,该线程会释放占用的所有锁资源,jvm会把该线程放到“等待池中”,不能自动唤醒,必须依靠其他线程调用notify或者notifyall方法

2.同步阻塞,运行的线程在获取同步锁Synchronized时,同步锁被其他线程占用,jvm会把该线程放到“锁池中”

3.其他阻塞,运行线程调用了sleep方法或者join方法,或者发出I/O请求,jvm会把线程设置为阻塞状态,当sleep超时,join终止或者超时,I/O处理完毕,线程会重新转到就绪状态。sleep是thread类方法。

 

sleep、wait、yield、join区别

1.锁池

所有需要竞争同步锁的线程都会放到锁池中(也就是被Synchronized修饰没有拿到锁的线程),当同步锁释放后,锁池中等待的线程要去竞争同步锁,当某个线程得到后就会进入就绪队列等待cpu分配资源。

2.等待池

当某个线程拿到Synchronized同步锁后,调用wait方法,该线程会释放占用的所有锁资源,jvm会将线程放到等待池中,等待池的线程是不会区竞争同步锁的,只有调用了notify或者notifyall方法才会开始去竞争锁,notify是随机从等待池中释放一个线程到锁池中,notifyall是释放所有的线程到锁池中。

1.sleep是tread线程的静态方法,wait是object的方法

2.sleep不会释放锁,而wait会释放锁,而且会进入等待队列中。

sleep是将cpu的执行资格和执行权释放,规定时间内不再运行此程序,当规定时间结束后在取回cpu资源,参与cpu的调度。

3.sleep不依赖Synchronized(在哪里都可用调用),wait需要依赖Synchronized。

4..sleep不需要被唤醒,wait需要唤醒。(现在也有带时间的一个重载方法)

5.sleep用于当前线程的休眠,或者轮询暂停操作,wait用于多线程之间的通信。

6.sleep会让出cpu的执行时间,强制上下文的切换,而wait不一定,wait还有机会重新竞争锁继续执行。

yield执行后,直接进去就绪状态,马上释放cpu的执行权,但任然保留着cpu的执行资格,所以有可能在cpu下次进入线程时还会让该线程继续执行。

join,执行后进入阻塞状态,阻塞的是调用该线程的线程,直到该线程执行结束。列如B线程调用了A线程,a.join方法阻塞的是b线程。

 

线程面试题

原文:https://www.cnblogs.com/jerrybu/p/14493381.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!