diff --git a/docs/java/concurrent/java-concurrent-questions-03.md b/docs/java/concurrent/java-concurrent-questions-03.md index 0b2dab5c..6e376bbf 100644 --- a/docs/java/concurrent/java-concurrent-questions-03.md +++ b/docs/java/concurrent/java-concurrent-questions-03.md @@ -366,9 +366,9 @@ public void allowCoreThreadTimeOut(boolean value) { 核心线程空闲时,其状态分为以下两种情况: - **设置了核心线程的存活时间** :核心线程在空闲时,会处于 `WAITING` 状态,等待获取任务。如果阻塞等待的时间超过了核心线程存活时间,则该线程会退出工作,将该线程从线程池的工作线程集合中移除,线程状态变为 `TERMINATED` 状态。 -- **没有设置核心线程的存活时间** :核心线程在空闲时,会一直处于 `WAITING` 状态,等待获取任务。 +- **没有设置核心线程的存活时间** :核心线程在空闲时,会一直处于 `WAITING` 状态,等待获取任务,核心线程会一直存活在线程池中。 -当核心线程获取任务之后,会由 `WAITING` 状态变为 `RUNNABLE` 状态,之后去执行对应任务。 +当队列中有可用任务时,会唤醒被阻塞的线程,线程的状态会由 `WAITING` 状态变为 `RUNNABLE` 状态,之后去执行对应任务。 #### 相关源码 @@ -378,14 +378,10 @@ public void allowCoreThreadTimeOut(boolean value) { 在获取任务的时候,会根据 `timed` 值来决定从任务队列( `BlockingQueue` )获取任务的行为。 -如果「设置了核心线程的存活时间」或者「线程数量超过了核心线程数量」,则将 `timed` 标记为 `true` ,表明获取任务时需要使用 `poll()` 指定超时时间,如果获取超时,则当前线程线程会退出线程池。 +如果「设置了核心线程的存活时间」或者「线程数量超过了核心线程数量」,则将 `timed` 标记为 `true` ,表明获取任务时需要使用 `poll()` 指定超时时间。 -- `timed == true` :使用 `poll()` 来获取任务。`poll()` 方法会指定获取任务的等待时间,如果到达等待时间之后,还没有获取到任务,则会返回 `null`。 -- `timed == false` :使用 `take()` 来获取任务。`take()` 方法是 `BlockingQueue` 中的阻塞方法,调用之后,线程会进入等待状态,直到从队列中获取任务。 - -因此,如果「设置了核心线程的存活时间」,核心线程没有在超时时间之内获取到任务,则会被销毁。 - -如果「没有设置核心线程的存活时间」,则核心线程在没有获取到任务时,会通过 `take()` 方法进行阻塞等待。 +- `timed == true` :使用 `poll()` 来获取任务。使用 `poll()` 方法获取任务超时的话,则当前线程会退出执行( `TERMINATED` ),该线程从线程池中被移除。 +- `timed == false` :使用 `take()` 来获取任务。使用 `take()` 方法获取任务会让当前线程一直阻塞等待(`WAITING`)。 源码如下: