Java线程池原理及几种线程池类型介绍

  http://xtu-xiaoxin.iteye.com/blog/647580


http://www.cnblogs.com/sachen/p/7401959.html


使用线程池的情况:

1.单个任务处理的时间比较短

2.  将需处理的任务量大


jdk自带线程池介绍

1.newFixedThreadPool:创建一个指定工线程数量的线程池,每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,将提交的任务存入池队列中。

返回ThreadPoolExecutor实例,接收参数为所设定线程数量nThread,corePoolSize为nThread,maxinumPoolSize为nThread,keepAliveTime为0L(不限时),unit为TimeUnit.MILLISECONDS,workQueue为newLinkedBlockingQueue<Runnable>无解阻塞队列。

创建可容纳固定线程数量的线程池,每个线程的存活时间是无限的,当池子满了就不再添加线程了,如果池中所有线程均在繁忙状态,对于新任务会进入阻塞队列中。

适用于执行长期的任务,性能好很多。

2.newCachedThreadPool:创建一个可缓存的线程池。这种类型的线程池特点:

    1)工作线程的创建数量几乎没有限制(其实也有限制,因为Integer.MAX_VALUE),这样可灵活的往线程池中添加线程。

   2)如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认1分钟),则该工作线程将自动终止,终止后,如果你又提交了新的任务,则线程池重新创建了一个工作线程。

返回一个ThreadPoolExecutor实例,corePoolSize为0,maxinumPoolSize为Integer.MAX_VALUE,keepAliveTime为60L,unit为TimeUnit.SECONDS,workQueue为SychronousQueue(同步队列)。

当新任务到来, 则插入到SynchronousQueue中,由于Synchronous是同步队列,因此会在池中寻找可用线程来执行,若有可用线程则执行,若没有可用线程则创建一个线程来执行;若池中线程空闲时间超过指定大小,则该线程会被销毁。

适用于执行很多短期异步的小程序或者负载较轻的服务器


 3.newSingleThreadExecutor:创建一个单线程化的Executor,即至创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一个取代他,保证顺序执行,单工作线程最大特点可保证顺序的执行各个任务,并且在任意给定的时间不会有多个线程是活的。

返回FinalizableDelegatedExecutorService包装的ThreadPoolExecutor实例,corePoolSize为1,maximumPoolSize为1,keepAliveTime为0L,unit为TimeUnit.MILLISECONDS,workQueue为newLinkedBlockingQueue<Runnable>无解阻塞队列。

创建只有一个线程的线程池,且线程的存活时间是无限的,当该线程正繁忙时,对于新任务会进入阻塞队列中。

适用于一个任务一个任务执行的场景。

4.newScheduleThreadPool:创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer。

创建ScheduledThreadPoolExecutor实例,corePoolSize为传递进来的参数,maximumPoolSize为Integer.MAX_VALUE,keepAliveTime为0L,unit为TimeUnit.NANOSECONDS,workQueue为new  DelayedWorkQueue()一个按超时时间升序排序的队列。

创建一个固定大小的线程池,线程池内线程存活时间无限制,线程池可以支持定时及周期性任务执行,如果所有线程均处于繁忙状态,对于新任务会进入DelayedWorkQueue,这是一种按照超时时间升序排序的队列结构。

适用于周期性执行任务的场景。


线程池任务执行流程

1.当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。

2.当线程池达到coePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行

3.当workQueue满时,且maximumPoolSize> coePoolSize时,新提交任务会创建新线程执行任务。

4.当提交任务数量超过maximumPoolSize,新提交任务由RejectedExecutionHandler处理

5.当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程

6.当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAlive也将关闭


备注:

1.一般如果线程池队列采用linkedBlockingQueue队列,那么不会拒绝任何服务(因为队列大小没有限制),这种情况下,ThreadPoolExecutor最多仅会按照最小线程数来创建线程,也就是说线程大小被忽略了。

2.如果线程池队列采用ArrayBlockingQueue队列的话,那么ThreadPoolExecutor将会采取一个非常负责的算法:

   比如假定线程池最小线程数是4,最大为8, 所用的ArrayBlockingQueue最大为10,随着任务到达并被放入队列中,线程池最多运行4个线程(最小线程数),即使队列完全填满,也就是说10个处于等待状态的任务,ThreadPoolExecutor也只会利用4个线程,如果队列已满,而又有新任务进来,此时才会启动一个新线程,这里不会因为队列已满而拒绝该任务,相反会启动一个新线程,新线程会运行队列中的第一个任务,为新来的任务腾出空间。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值