记一次线程池的运用ITeye - 亚美娱乐

记一次线程池的运用ITeye

2019年03月09日15时57分29秒 | 作者: 鸿畅 | 标签: 线程,运用,行列 | 浏览: 2130

本文介绍多线程在运用时由直接new Thread()到Executors.newCachedThreadPool(),再到直接new ThreadPoolExecutor()的进程。

 

布景:

项目需求在Servlet前加个Filter做数据的转发,仅仅数据的简略透传,为了不影响用户的体会,而选用多线程来完成。

 

最简略的完成

直接在filter中new Thread来完成,如下:

 可是访问量一大,这种办法会把体系搞死。

 

线程池完成

后边选用线程池的办法完成,尽管之前也有研讨过线程池,可是对线程池的回忆最深的就是线程池是对线程的缓存,重复运用,防止线程的重复创立和毁掉带来的功能损耗,还有就是ExecutorService类供给的几种线程池办法:signle线程数的线程、线程数固定的线程、线程数不固定的线程。其时也没多考虑,忧虑影响体系的并发数,就直接运用Executors.newCachedThreadPool()缓存的线程池,如下:

 可是上线一段时刻后,运维反馈体系不太安稳,但也没有直接原因表明是该线程池导致,接着研讨。

 

自己的想象

后边觉得这儿就是数据的转发,其实也就是一个典型的生产者和顾客模型,能够运用一个堵塞行列来把恳求数据缓冲起来,再运用一个线程池把数据消费掉,想到之前研讨过的并发大师Doug Lea写的几个并发行列,不错,再比较下这几个行列运用的是显现锁仍是CAS就能断定运用哪个行列了,有搞头...

 

线程池的原理

古人云:没文化,真可怕。合理我开开心心的写我的生产者顾客,运用线程池来消费行列里的使命时悲惨剧的发现,线程池也有行列来缓存使命,我上面的规划就是线程池的另一个作用,线程池不仅仅对线程的办理,防止线程的重复创立和毁掉带来的功能损耗,而且还对使命的缓冲,进步体系的响应速度。

 

比较靠谱的完成

经过直接研讨线程池的完成类ThreadPoolExecutor,而不是之前只重视线程池的铺助类和接口,运用线程数量固定、LinkedBlockingQueue为缓存使命的行列,假如使命行列满了就做丢掉处理,如下:

 

ThreadPoolExecutor类的结构函数为:

public ThreadPoolExecutor(int corePoolSize,
 int maximumPoolSize,
 long keepAliveTime,
 TimeUnit unit,
 BlockingQueue Runnable workQueue,
 ThreadFactory threadFactory,
 RejectedExecutionHandler handler)

 

 创立一个线程池需求输入几个参数:

corePoolSize(线程池的根本巨细):当提交一个使命到线程池时,线程池会创立一个线程来履行使命,即便其他闲暇的根本线程能够履行新使命也会创立线程。假如调用了线程池的prestartAllCoreThreads办法,线程池会提早创立并发动一切根本线程。 maximumPoolSize(线程池最大巨细):线程池答应创立的最大线程数。假如行列满了,而且已创立的线程数小于最大线程数,则线程池会再创立新的线程履行使命。值得注意的是假如运用了无界的使命行列这个参数就没什么作用。 keepAliveTime(线程活动坚持时刻):线程池的作业线程闲暇后,坚持存活的时刻。所以假如使命许多,而且每个使命履行的时刻比较短,能够调大这个时刻,进步线程的运用率。 TimeUnit(线程活动坚持时刻的单位):可选的单位有天(DAYS),小时(HOURS),分钟(MINUTES),毫秒(MILLISECONDS),微秒(MICROSECONDS, 千分之一毫秒)和毫微秒(NANOSECONDS, 千分之一微秒)。 workQueue(使命行列):用于保存等候履行的使命的堵塞行列。 能够挑选以下几个堵塞行列。 ArrayBlockingQueue:是一个根据数组结构的有界堵塞行列,此行列按 FIFO(先进先出)准则对元素进行排序。 LinkedBlockingQueue:一个根据链表结构的堵塞行列,此行列按FIFO (先进先出) 排序元素,吞吐量一般要高于ArrayBlockingQueue。静态工厂办法Executors.newFixedThreadPool()运用了这个行列。 SynchronousQueue:一个不存储元素的堵塞行列。每个刺进操作有必要比及另一个线程调用移除操作,不然刺进操作一向处于堵塞状态,吞吐量一般要高于LinkedBlockingQueue,静态工厂办法Executors.newCachedThreadPool运用了这个行列。 PriorityBlockingQueue:一个具有优先级的无限堵塞行列。
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表亚美娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    记一次线程池的运用ITeye

    线程,运用,行列
  • 2
  • 3
  • 4
  • 5
  • 6

    Digester 解析XMLITeye

    元素,参数,解析
  • 7

    运用文件体系ITeye

    目录,读取,是否
  • 8
  • 9
  • 10

    Deep diving into CloningITeye

    文章,摘自,首先