- [[The Anxious Generation]] - {{cards [[java]] }} - 线程池中提交一个任务的流程是怎样的? #card #java - 使用 {{cloze execute}} 来提交一个任务,使用 {{cloze submit}} 后会放在 {{cloze 一个Future里面}} ,返回 {{cloze 一个Future}} - 提交之后判断 {{cloze 当前woker数量}} 是否达到 {{cloze 最大核心线程数}} ,没有达到就创建线程并执行任务 - 如果该数值已经达到最大值,就将该任务放入 {{cloze 阻塞队列}} - 如果 {{cloze 阻塞队列已满}} , addWorker创建新的线程,如果达到 {{cloze 最大线程数}} ,就执行 {{cloze 拒绝策略}} ,默认为 {{cloze RejectedExecutionHandler,达到最大就抛出异常}} - - 线程池中有 {{cloze 5}} 种状态,分别是如何变化的 #card #java - 线程池中使用一个 {{cloze Atomic类型的ctl}} 变量来存储状态 - 共有以下5个状态 - RUNNING {{cloze 运行中的状态,此时会接受新提交的任务}} - SHUTDOWN {{cloze 不再接受新的任务,已有的任务会继续执行完成}} - STOP {{cloze 不接受新任务,并且立即中止正在执行的任务}} - TIDYING {{cloze 所有线程都中止后,会进入该状态,等待关闭}} - TERMINATED {{cloze 执行了terminated()方法后即进入该状态}} - 如何优雅地停止一个线程 #card #java - 开启一个线程 - 无返回值,使用 {{cloze execute}} - 有返回值,使用 {{cloze submit}} - 使用thread对象的 {{cloze stop()}} 方法 `false` - 该方法会直接停止,已废弃,会释放 {{cloze synchronized锁}},但是不会释放 {{cloze ReentrantLock锁}} - 使用 {{cloze interrupt}} 方法 `true` - 通过 {{cloze Thread.getCurrent.isInterrupted}} 可以接受到中断的信号,但是由线程自己控制是否中止 - 睡眠时被中断会抛出 {{cloze InterruptedException}} -