ForkJoinPool.commonPool满时的行为?及是否阻塞新Runnable的疑问
关于ForkJoinPool.commonPool满时的行为及CompletableFuture.runAsync的问题解答
一、当ForkJoinPool.commonPool满时会发生什么?
- 这里的“满”指的是commonPool配置的所有工作线程(比如你提到的4个)都处于忙碌状态。
- 此时新提交的任务(比如
CompletableFuture.runAsync提交的Runnable)会被放入commonPool的内部任务队列等待,不会直接被拒绝。 - ForkJoinPool的任务窃取机制会让空闲的工作线程去“偷取”其他线程队列里的任务执行,但如果所有线程都处于忙碌状态,任务就只能在队列里排队,直到有线程空闲出来处理。
- 注意:提交任务的动作本身不会被阻塞,除非你后续调用了
get()、join()这类同步等待方法,才会阻塞调用线程直到任务完成。
二、你的判断是否正确?
你的判断不正确。
CompletableFuture.runAsync默认使用commonPool提交任务时,提交操作是非阻塞的——不管commonPool的线程是否全忙,提交动作都会立即返回,任务只是进入队列等待执行。- 你遇到的长请求问题,更可能是因为commonPool并行度太低(仅4个线程),而提交的任务是长耗时任务,导致大量任务在队列积压,后续任务等待执行的时间过长,最终表现为请求响应缓慢。
内容的提问来源于stack exchange,提问作者Gao
相关产品推荐
相关产品推荐

