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个线程,如果队列已满,而又有新任务进来,此时才会启动一个新线程,这里不会因为队列已满而拒绝该任务,相反会启动一个新线程,新线程会运行队列中的第一个任务,为新来的任务腾出空间。