当前位置: 移动互联网学院 > Java培训 > JAVA开发 > 什么是Java线程池
什么是Java线程池 时间:2017-08-15     来源:华清远见JAVA学院

今天要和大家分享的是Java线程池的一些知识,内容涵盖什么是Java线程池、Java线程池的作用和实现原理是什么,希望对大家有所帮助。

什么是Java线程池?

Java线程池顾名思义,就是一个存放Java线程的缓冲区,里面有一些已经创建好的Java线程,需要用到Java线程的时候,直接取用即可。

为什么要引入Java线程池?

任何语言的终极目标都是利用少的资源、快的完成多的事,所以Java线程池的引入也不例外。

Java线程池的作用

Java线程池可以实现重复利用已经创建的线程,减少创建线程和销毁线程的开销,提高响应速度,不需要等到线程创建就能立即执行,使用线程池可以进行统一分配,调优和监控,总的来说:降低资源消耗,提高响应速度,提高线程可管理性。

Java线程池中的一些重要参数

corePoolSize:

核心池的大小,构建线程池后,并不会创建线程,当前线程数如果小于corePoolSize时,当要执行任务时,创建一个线程。当当前线程数等于corePoolSize,会将任务放入队列中

maximumPoolSize:

线程池大数,也就是线程多能创建的线程

keepAliveTime:

工作线程空闲后,保持存活的时间。默认情况下,如果当前线程数大于corePoolSize,那么一个线程如果没有任务,当空闲的时间大于keepAliveTime时,会终止该线程,直到线程数不超过corePoolSize

rejectedExecutionHandler:

拒绝处理任务的策略AbortPolicy(直接放弃任务,抛出RejectedExecutionException异常),DiscardPolicy(放弃任务,不抛出异常),DiscardOldestPolicy(放弃旧的未处理请求,然后重试 execute;如果执行程序已关闭,则会丢弃该任务),CallerRunsPolicy(它直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务)-达内编程培训

Java线程池的实现原理

提交任务,核心线程池(corePoolSize)是否已经满,如果未满的话就创建线程执行任务,否则查看队列(BlockingQueue)是否已满,未满的话,将任务存储在队列里,如果已经满了,看线程池(maximumPoolSize)是否已满,如果满的话按照拒绝处理任务策略(handler)处理无法执行的任务。如果未满,创建线程执行任务。ThreadPoolExecutor构造参数

workQueue:存储任务的队列,有几种种类型队列ArrayBlockingQueue(有界缓冲区,基于数组的队列,先进先出,必须指定大小,可以设置是否保持公平,以FIFO顺序访问),LinkedBlockingQueue(基于链表的队列,如果没有指定大小,默认为Integer.MAX_VALUE),SynchronousQueue(无界线程池,不管多少任务提交进来,直接运行)

ThreadFactory:线程工厂,用来创建线程,通过线程工厂可以给创建的线程设置名字。

X