对于Java中 Thread 对象,同一个线程对象调用 start 方法后,会在执行完run 后走向终止(TERMINATED)状态,也就是说一个线程对象是不可以通过多次调用 start 方法重复执行 run 方法内容的。Java的线程是不允许启动两次的,第二次调用必然会抛岀 IllegalThreadStateEXception,这是一种运行时异常,多次调用 start 被认为是编程错误。
问题:那 Java 线程池中是如何保证核心线程不会终止的呢?
核心线程只是一个叫法, 核心线程与非核心线程的区别是:创建核心线程时会携带一个任务, 而非核心线程没有
如果 timed 为 True, 线程经过 非核心线程过期时间后还没有获取到任务, 则方法结束, 后续会将 Worker 进行回收
如果没有设置 allowCoreThreadTimeOut 为 True, 以及当前线程池内线程数量不大于核心线程
那么从阻塞队列获取的话是 take(), take() 会 一直阻塞, 等待任务的添加返回
通过队列的 take 方法阻塞核心线程(Worker)的 run 方法从而保证核心线程不被销毁的,这样也就间接达到了核心线程数不会被回收的效果。