任务并行

任务并行的实质是同时可以运行的线程数量。

jdk concurrent future callable,要写匿名块在callable内完成业务逻辑,future.get方法会过早的阻塞调用线程,还要结合future. is Done取得 子线程的结果,否则就是轮询取得结果。这只能在调用线程处理一个任务,当有多个任务并行时代码块较多,子线程的处理结果合并到调 用线程、或子线程的异常在调用线程难以处理,还会有callback hell的问题。

以前主流的CPU都是单核,CPU的核心频率是运行程序性能重要指标。当日刘ava比较流行的是单线程编程,对于CPU密集型的应用程序而 言,频繁的通过多线程进行协作和抢占时间片反而会降低性能。

现在的CPU基本上是多核,每核多硬件线程。比如我这台电脑是2核,2硬件线程。在一个CPU时钟周期内,每核2硬件线程中只有一个可 以运行。当CPU发生长延迟时,如果同一个核中还有其他就绪的硬件线程,下一个时钟周期就会让这个硬件运行。相比,每核单硬件线程 的CPU,就会被长延迟事件所阻塞,因为等待事件完成浪费时钟周期。对于这类CPU,如果就绪的应用线程已经准备好运行却没有可用的 硬件线程,运行前就必须进行线程上下文切换,线程上下文切换通常要消耗数百个时钟周期。而每核多硬件线程的CPU可以在下一个时钟 周期切换到同核上的另一个就绪线程,对于有许多执行线程的应用,每核多硬件线程的CPU会执行的更快。

线程模型的发展过程:

Screen Shot 2020-06-17 at 11.05.46 AM.png

・单线程处理所有请求,n个请求:1个线程,只有在完全处理好一个请求后才能接收下一个请求,一个请求blocking,会导致后续请求无法处理。

Screen Shot 2020-06-17 at 11.08.12 AM.png

・多线程处理所有请求,n个请求::n个线程,来一个请求new一个线程,创建新线程的操作是很昂贵的,JVM要为这个操作分配资 源。每个线程要在栈里保存自己的信息,64位的JVM里默认的栈空间是1024K,当因请求量增加导致new出相对应数量的线程数时, JVM就需要维护相对应数量的栈空间,如果是1000个请求,JVM光栈空间就需要1024K *1 000 =1G的RAM,每个线程自己在堆上产 生许多对象,会导致JVM的堆被占满,会导致JVM平凡GC,只要一GC,整个JVM就会stop-the-world,只要stop-the-word整个 JVM只会根据GC算法执行不同的GC,暂停处理我们的应用程序,影响应用性能的同时,也可能会导致JVM outofmemory、 stackoverilow。线程消耗不止RAM,还可能会消耗其它有限的资源,比如file descriptor文件描述符、socketfd socket描述符、文件 句柄、数据库连接。(linux的select单个进程所打开的FD是有一定限制的,默认值1024。 epoll并没有这个限制,它支持的FD上限是 操作系统的最大文件句柄数,这个数远大于1024。 1GB内存的机器大约是10万个句柄左右,通常这个值跟操作系统的内存关系较 大)过多消耗这些可能导致错误或系统崩溃。

Screen Shot 2020-06-17 at 11.13.18 AM.png

. 线程池处理所有请求,m个请求: n个线程,通过线程池避免创建新线程,限制最大线程数量。线程池跟踪着所有线程,在线程数量达到上限前,它会创建新的线程 ,当有空闲线程时,它会使用空闲线程。

使用 jdk concurrent threadpool分为非固定的线程池(指定线程池中最小线程数和最大线程数的 ThreadPoolExecutors、 newCacheThreadPool)和固定大小(newFixedThreadPool.. newSingleTh read Exector)。 newCache丁h read Poo}这种线程还是有无法限制线程数量的问题,但是它会优先使用线程池中已创建的空闲线程来处理请求。这种类 型的线程池特别适用于执行短期任务的请求,因为它们不会长时间的阻塞外部资源。对于线程数量固定的线程池,当线程池中的线程 都在工作时,一个新的请求到达,丁h read Pool Executor可能会使用一个队列来组织新到达的请求,直到线程池中有空闲的线程可以使 用。Executors. nexFixedThread Pool方法默认创建一个没有长度限制的LinkedList (lnteger.MAX_VALUE)。这个LinkedList也可能会 产生系统资源耗尽的问题。队列中请求所占用的资源可能是file descriptor文件描述符、sockeffd socket描述符,而操作系统对同时打 开的FD是有限制的。因此,限制工作队列的长度也是有意义的。自定义Thread PoolExecutor,如果所有的线程都在执行任务,而且 工作队列也被请求填满了,此时对于新到达请求的处理方式,取决于Thread Pool Executor构造方法的最后一个参数。(Discard Policy 让线程池丢弃新到达的请求;AbortPol icy会让Executor抛出一个异常丢弃新到达的任务;CallerRunsPolicy会使任务在它的调用端线 程池中执行,可能会阻塞一个原来不应阻塞的线程;)

线程池中应该创建多少线程应该根据各个应用系统的经过负载测试后的数据来定。线程池中最大线程数应该被限制,这样才不会导致 系统资源被耗尽(系统资源包括内存堆栈,打开的file descriptor文件句柄、socketfd socket tcp连接、数据库连接等。如果线程执行 的是CPU密集型任务,计算型任务,创建的线程不应该超过CPU的内核数量)。

最佳实践

设置deadline,处理某个请求超过了timeout时间,这个线程就应该被停止,为新的请求腾出资源
failfast机制,如果线程执行没响应了,线程池中的线程数会迅速达到上限,这些线程都在等待前面没有响应的线程。使用failfast,所 有后续的请求都会迅速失败,而不是进行不必要的等待。

reactor模式,参考大神Doug Lea的 <<Scalable IO in Java>>

其它的并发处理方式

guava ListenableFuture
fork/join,
actor模式,akka并发就是基于actor模式
reactive programming,响应式编程,基于stream来处理,调用线程拿不到子线程的结果和异常
协程框架

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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