ThreadPoolExecutor(一) 入门

缘起

当我在阅读 Spring  使用 Callable<T> 对象作为返回值,实现 Spring MVC 的请求异步处理。


Spring MVC 3.2 introduced Servlet 3 based asynchronous request processing. Instead of returning a value, as usual, a controller method can now return a java.util.concurrent.Callable and produce the return value from a separate thread. Meanwhile the main Servlet container thread is released and allowed to process other requests. Spring MVC invokes the Callable in a separate thread with the help of a TaskExecutor and when the Callable returns, the request is dispatched back to the Servlet container to resume processing with the value returned by the Callable. Here is an example controller method:

文档中提到 Spring 时通过 TaskExecutor 去处理 Callable 对象,而 TaskExecutor 的实现类 ThreadPoolTaskExecutor 又基于 j.u.c下 的 ThreadPoolExecutor,那么我先简单的认为就是通过ThreadPoolExecutor来处理这些异步请求。

猜想问题:如果请求速度大于处理速度,瓶颈会在哪里?

ThreadPoolExecutor 是什么?

在了解一个概念、实物,应该首先想到,这玩意儿是什么 —— 小贱 本人如是说

JDK 说明如下:An ExecutorService that executes each submitted task using one of possibly several pooled threads, normally configured using Executors factory methods.

原来是一个实现了 ExecutorService 接口的线程池,通常是通过 Executors 的工厂方法 返回你想要的 线程池。本能的理解线程池就是管理一堆线程的池子,然后呢?要更透彻的理解一个事物的存在,那我觉得是从它解决了什么问题来理解比较接地气。


线程池的作用是什么?


1、执行任务:这里的任务是针对关键词 task 来描述的,所以在接口如 submit 接收参数有很多类型的 task,如 Runnable,Callable,这个是最最基本的功能, 不然就没有存在的意义了。

2、控制线程数:如果系统共存的线程数太多,虽然不是很了解,但个人感觉不是一个好的征兆,比如线程切换的开销在线程数太多的时候是不能被忽视了…… 当然,这个是看业务场景的,如果业务不会有频繁调用,new Thread 也能接受,但这个不是线程池要解决的问题。

3、复用线程,减少线程的创建、销毁开销:当业务访问量比较低的时候,每次访问创建一个线程,其实创建、销毁线程的开销并不是一个必须解决的问题,尤其是任务处理需要特别久的时候,这里也不是线程池要解决的问题。当业务访问量达到一定量的时候,如 QPS 1K,每次处理请求耗时也很短,这里我做个简单的数学假设:

         T1 = 线程创建的时间, T2 = 线程执行任务的时间, T3 = 线程销毁的时间。

非复用线程的处理时间: T1 + T2 + T3

复用线程的处理时间: T2

试想,如果 T2 的时间和 T1、T3接近,或者小于,那么复用的意义就非常大了。

到目前为止,我认为对 ThreadPoolExecutor 算是入门了,因为我们可以根据 ThreadPoolExecutor 的作用粗略判断是否可用,用在什么地方了。至于使用的代码例子,我相信网上一搜一大波,后续小贱想稍微深入理解一下这个线程池机制,比如说 keepAliveTime,存放 Task 的 BlockingQueue 等。如有理解上的出入,欢迎拍砖吐槽,不要怜惜我!

后续我打算解读 ThreadPoolExecutor 的 官方文档,并加入一些自己的见解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容