Java 多线程面试题
大约 1 分钟
Java 的 sleep 和 wait 的区别
Sleep 是 Thread 的静态方法,wait 是 Object 的方法,任何对象都可以调用;
sleep 不会释放锁,它也不需要占用锁。Wait 会释放锁,但调用它的前提是当前线程占有锁;
他们都可以被 interrupted 方法打断。
怎么让一个线程等待另一个线程?
可以使用 wait 礼让
join等待其它线程终止
线程状态
线程从创建启动到结束,一共需要经历五种状态:新建、就绪、阻塞、运行、死亡;线程刚被创建的时候,处于新建状态,新建状态的线程并没有开始运行;Thread 的 start() 方法可以让线程从新建状态过渡到就绪状态,就绪状态的线程需要等到 CPU 的调度才会真正的执行起来,也就是执行 run() 方法,进入运行态;运行态的线程会随着 run() 执行完毕,或是发生异常、或是程序中断等各种原因,会进入一个消亡的状态,完成当前线程的一个生命周期;但运行态的线程会因为资源缺失,进入到就绪态;也会因为 IO 阻塞、等待同步锁等情况,进入到阻塞态,阻塞状态的线程会进入等待,直到线程得到唤醒,达到满足继续执行的状态,进入到就绪态,重新从就绪态进入到运行态。