标签:
使用Java自带的线程池,一般都是如下的使用:
ExecutorService exec = Executors.newCachedThreadPool(); //will create one thread for each task for(int i=0;i<7;i++){ exec.execute(new BasicThread()); } exec.shutdown();
一般使用newFixedThreadPool、newSingleThreadExecutor或者newCachedThreadPool来创建不同类型的线程池。
下面看看这几个方法的源代码:
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); }
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
底层用到的都是ThreadPoolExecutor,但是实现的方法是不太一样的。我们可以直接使用ThreadPoolExecutor来实现各种不同的线程池。
ThreadPoolExecutor的构造方法如下:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
其中的workQueue和handler是实现不同功能线程池的关键。
在看workQueue和handler先看看其他参数的含义:
* corePoolSize - 池中所保存的线程数,包括空闲线程。
* maximumPoolSize - 池中允许的最大线程数(采用LinkedBlockingQueue时没有作用)。
* keepAliveTime -当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间,线程池维护线程所允许的空闲时间。
* unit - keepAliveTime参数的时间单位,线程池维护线程所允许的空闲时间的单位:秒 。
* workQueue - 执行前用于保持任务的队列(缓冲队列)。此队列仅保持由execute 方法提交的 Runnable 任务。
* RejectedExecutionHandler -线程池对拒绝任务的处理策略(重试添加当前的任务,自动重复调用execute()方法)
当一个任务通过execute(Runnable)方法欲添加到线程池时:
标签:
原文地址:http://www.cnblogs.com/lnlvinso/p/4640769.html