核心内容摘要
“おまえの母親をだます”——一句日语,掀起一场文化与情感的探秘之旅
ã€�Javaå¹¶å�‘】ForkJoinPoolå’ŒThreadPoolExecutor的区别1ã€�ForkJoinPoolå’ŒThreadPoolExecutor的区别2ã€�为什么CompletableFuture使用ForkJoinPool1ã€�ForkJoinPoolå’ŒThreadPoolExecutor的区别ForkJoinPoolå’ŒExecutorService都是Javaä¸å¸¸ç”¨çš„çº¿ç¨‹æ± çš„å®�ç�°ä»–们主è¦�在å®�ç�°æ–¹å¼�上有一定的区别所以也就会带æ�¥é€‚用场景上é�¢çš„区别。首先在å®�ç�°æ–¹å¼�上ForkJoinPool 是基äº�工作窃å�–Work-Stealing算法å®�ç�°çš„çº¿ç¨‹æ± ForkJoinPool 䏿¯�个线程都有自己的工作队列用äº�å˜å‚¨å¾…执行的任务。当一个线程执行完自己的任务之å��会ä»�其他线程的工作队列ä¸çªƒå�–ä»»åŠ¡æ‰§è¡Œä»¥æ¤æ�¥å®�ç�°ä»»åŠ¡çš„åŠ¨æ€�å�‡è¡¡å’Œçº¿ç¨‹çš„利用ç�‡æœ€å¤§åŒ–。ThreadPoolExecutor 是基äº�任务分é…�Task-Assignment算法å®�ç�°çš„çº¿ç¨‹æ± ThreadPoolExecutor ä¸çº¿ç¨‹æ± 䏿œ‰ä¸€ä¸ªå…±äº«çš„工作队列所有任务都将æ��交到这个队列ä¸ã€‚çº¿ç¨‹æ± ä¸çš„线程会ä»�队列ä¸è�·å�–任务执行如æ�œé˜Ÿåˆ—为空则线程会ç‰å¾…ç›´åˆ°é˜Ÿåˆ—ä¸æœ‰ä»»åŠ¡ä¸ºæ¢ã€‚ForkJoinPool ä¸çš„任务通常是一些å�¯ä»¥åˆ†å‰²æˆ�多个å�任务的任务例如快速æ�’åº�。æ¯�个任务都å�¯ä»¥åˆ†æˆ�两个或多个å�任务然å��ç”±ä¸�å�Œçš„线程æ�¥æ‰§è¡Œè¿™äº›å�任务。在这个过程ä¸ForkJoinPool 会自动管ç�†ä»»åŠ¡çš„æ‰§è¡Œã€�分割和å�ˆå¹¶ä»�而å®�ç�°ä»»åŠ¡çš„åŠ¨æ€�分é…�和最优化执行。ForkJoinPool ä¸çš„工作线程是一ç§�特殊的线程ä¸�æ™®é€šçº¿ç¨‹æ± ä¸çš„工作线程有所ä¸�å�Œã€‚它们会自动地创建和销æ¯�以å�Šè‡ªåŠ¨åœ°ç®¡ç�†çº¿ç¨‹çš„æ•°é‡�和调度。这ç§�æ–¹å¼�å�¯ä»¥é™�ä½�çº¿ç¨‹æ± çš„ç®¡ç�†æˆ�本æ��高线程的利用ç�‡å’Œå¹¶è¡Œåº¦ã€‚ThreadPoolExecutor ä¸çº¿ç¨‹çš„创建和销æ¯�是é�™æ€�çš„çº¿ç¨‹æ± åˆ›å»ºå��会预先创建一定数é‡�çš„çº¿ç¨‹æ ¹æ�®ä»»åŠ¡çš„æ•°é‡�动æ€�调整线程的利用ç�‡ä¸�会销æ¯�线程。如æ�œçº¿ç¨‹é•¿æ—¶é—´å¤„äº�空闲状æ€�å�¯èƒ½ä¼šå� 用过多的资æº�。在使用场景上也有区别ThreadPoolExecutor 适å�ˆå¤„ç�† IO 密集å�‹æˆ–普通 CPU 任务如网络请求处ç�†ã€�æ•°æ�®åº“访问ã€�Web æœ�务请求调度。尤其是大é‡�独立ã€�ä¸�需è¦�拆分的å°�任务。ForkJoinPool 适å�ˆäº� CPU 密集å�‹ã€�å�¯æ‹†åˆ†çš„并行计算任务大任务分解为å°�任务适用äº�å�¯ä»¥é€’归分解为更å°�任务的大å�‹ä»»åŠ¡ã€‚ForkJoinPool 通过分而治之的方å¼�将大任务拆分为å°�任务这些å°�任务å�¯ä»¥å¹¶è¡Œå¤„ç�†ã€‚计算密集å�‹ä»»åС坹äº�需è¦�大é‡�计算且能够并行化的任务ForkJoinPool 是一个ç�†æƒ³çš„é€‰æ‹©ã€‚å®ƒèƒ½å¤Ÿæœ‰æ•ˆåˆ©ç”¨å¤šæ ¸å¤„ç�†å™¨çš„优势æ�¥åŠ é€Ÿå¤„ç�†è¿‡ç¨‹ã€‚递归算法的并行化适å�ˆäº�å�¯ä»¥ç”¨é€’归方法解决的问题如快速æ�’åº�ã€�å½’å¹¶æ�’åº�ã€�图åƒ�处ç�†ä¸çš„分区算法ç‰ã€‚æ•°æ�®è�šå�ˆä»»åŠ¡åœ¨å¤„ç�†éœ€è¦�è�šå�ˆå¤šä¸ªæ•°æ�®æº�结æ�œçš„任务时例如é��å�†æ ‘结æ�„å¹¶è�šå�ˆç»“æ�œForkJoinPool æ��供了有效的方å¼�æ�¥å¹¶è¡ŒåŒ–这一过程。2ã€�为什么CompletableFuture使用ForkJoinPoolCompletableFuture 使用 ForkJoinPool 而ä¸�是 ExecutorService çš„å�Ÿå› 主è¦�æ˜¯å› ä¸ºå®ƒçš„æ‰§è¡Œæ¨¡å�‹å’Œä»»åŠ¡åˆ†å‰²æ–¹å¼�ä¸� ForkJoinPool æ›´åŠ åŒ¹é…�。在 CompletableFuture ä¸ä¸€ä¸ªä»»åŠ¡å�¯ä»¥åˆ†å‰²æˆ�多个å�任务并且这些å�任务之间å�¯ä»¥å˜åœ¨ä¾�赖关系。而ForkJoinPool 本身就是一ç§�支æŒ�任务分割和å�ˆå¹¶çš„çº¿ç¨‹æ± å®�ç�°èƒ½å¤Ÿè‡ªåŠ¨åœ°å¤„ç�†ä»»åŠ¡çš„æ‹†åˆ†å’Œå�ˆå¹¶ã€‚而且ForkJoinPool 还有一ç§�工作窃å�–算法能够自动地调整线程的负载æ��高线程的利用ç�‡å’Œå¹¶è¡Œåº¦ã€‚ForkJoinPool è¿˜æœ‰ä¸€ä¸ªç‰¹ç‚¹å°±æ˜¯å®ƒçš„çº¿ç¨‹æ± å¤§å°�是动æ€�è°ƒæ•´çš„ã€‚å½“ä»»åŠ¡æ¯”è¾ƒå°‘æ—¶çº¿ç¨‹æ± çš„å¤§å°�会自动缩å°�ä»�而å‡�少了线程的数é‡�å’Œå� 用的系统资æº�ã€‚å½“ä»»åŠ¡æ¯”è¾ƒå¤šæ—¶çº¿ç¨‹æ± çš„å¤§å°�会自动å¢�åŠ ä»�而ä¿�è¯�任务能够å�Šæ—¶åœ°å¾—到执行。如æ�œä½¿ç”¨ ExecutorService æ�¥æ‰§è¡Œè¿™äº›ä»»åŠ¡éœ€è¦�æ‰‹åŠ¨åœ°åˆ›å»ºçº¿ç¨‹æ± ã€�任务队列和任务执行ç–略并且需è¦�手动地处ç�†ä»»åŠ¡çš„æ‹†åˆ†å’Œå�ˆå¹¶å®�ç�°èµ·æ�¥ç›¸å¯¹æ¯”较å¤�æ�‚ã€‚å› æ¤ForkJoinPool æ›´åŠ é€‚å�ˆ CompletableFuture 的执行模å�‹ã€‚