多线程是并发执行的能力;线程池是管理线程的容器,用来复用线程、避免频繁创建销毁线程。
上面的东西看不懂,本质还是对线程没有足够了解,任务执行在哪其实自己都不知道:
//你熟悉的: public void issue() { doA(); // 当前线程一步一步执行 doB(); doC(); }谁调用issue(),谁的线程就一行行跑doA->doB->doC。比如 Tomcat 收到 HTTP 请求,就派一个http-nio-8080-exec-1线程来跑你的Controller方法。你打个断点看线程名,就是这个。
缺点:doB要 2 秒,老板(这个请求线程)就卡 2 秒,啥也干不了。
这时候就可以用到线程池了:
你项目里的ThreadPoolTaskExecutor就是一个包工头,手下养着一批工人(线程)+ 一个待办箱(BlockingQueue)。
heavyPool.submit(() -> processChunk(chunk)); // 1. 把任务包成 Runnable 扔进队列就(排队)能让线程池指认线程去干活了(这就是任务进入到到线程的入口)
但这只是多线程,还有的地方用到的是多线程池,其实道理是一样的,线程池里面的队列也是要排队的,本质都是把任务分开,不管是分到不同的线程还是不同线程池的队列