2. 线程池的参数如下:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); }
说明:
线程池按以下行为执行任务
1)当线程数小于核心线程数时,创建线程。
2)当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
3)当线程数大于等于核心线程数,且任务队列已满
i)若线程数小于最大线程数,创建线程
ii)若线程数等于最大线程数,抛出异常,拒绝任务
3. 例子
public static void main(String args[]) throws InterruptedException { ThreadPoolExecutor executor; executor = new ThreadPoolExecutor(3, 10, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(10)); for(int i=0;i<20;i++){ Runnable r=new Runnable(){ @Override public void run() { System.out.println("thread run..."); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } }; executor.execute(r); } }
结果说明:
1)如果队列不指定大小,默认大小无限大,这样队列不会满,每次只有三个coreThread来
跑(大于核心线程数,但队列不满,任务放入队列中);
2)如果指定队列大小为10,则最大的10个工作线程来跑;
3)如果指定队列大小为5,则队列满了,后面的线程被reject掉了。