今天出去参加一个卖货公司的interview,抱着学习的态度去看了一下,interviewer还是不错的,
问的问题都在点上,让平时对java语言很自信的我,发现自己有些方面,其实理解有严重误区。希望
这篇帖子能给到大家帮助。
java线程的几种状态:new,runnable,running,blocked,waiting,timed_waiting,dead
好了,问题来了,blocked和waited有什么区别:
我之前总有个误解,完全和正确答案没有关系,这边就不出来了,防止误导大家。
下面我贴出正确答案:
/**
* Thread state for a thread blocked waiting for a monitor lock.
* A thread in the blocked state is waiting for a monitor lock
* to enter a synchronized block/method or
* reenter a synchronized block/method after calling
* {@link Object#wait() Object.wait}.
*/
BLOCKED,
/**
* Thread state for a waiting thread.
* A thread is in the waiting state due to calling one of the
* following methods:
* {@link Object#wait() Object.wait} with no timeout
* {@link #join() Thread.join} with no timeout
* {@link LockSupport#park() LockSupport.park}
*
*
* A thread in the waiting state is waiting for another thread to
* perform a particular action.
*
* For example, a thread that has called Object.wait()
* on an object is waiting for another thread to call
* Object.notify() or Object.notifyAll() on
* that object. A thread that has called Thread.join()
* is waiting for a specified thread to terminate.
*/
WAITING,
上面是jdk源码对这两种状态的描述,很明显了,BLOCKED状态主要是线程为了获取
monitor锁进去同步块或者同步同步方法中,被阻塞住,产生的一种阻塞状态。
而waiting状态是指,一个线程在等待另外一个线程的某种动作而产生的等待状态。
再通俗一点说,blocked的是线程推进到某个关卡,门被关上了,这时候只能被迫等待关卡打开。而waiting是指线程在某个地方停下来,需要得到其他线程的信号才能出发。
blocked是被动等待,timed的是主动等待。
BLOCKED状态: synchronized关键字
WAITING状态: wait,join,park
TIMED_WAITING状态: sleep,wait,join,parkNanos,parkUntil