[b]1. 线程池可以节省创建多个线程带来的开销问题。[/b]
[b]2. 线程池的参数如下:[/b]
说明:
[b] 线程池按以下行为执行任务
1)当线程数小于核心线程数时,创建线程。
2)当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
3)当线程数大于等于核心线程数,且任务队列已满
i)若线程数小于最大线程数,创建线程
ii)若线程数等于最大线程数,抛出异常,拒绝任务[/b]
3. 例子
结果说明:
[b] 1)如果队列不指定大小,默认大小无限大,这样队列不会满,每次只有三个coreThread来
跑(大于核心线程数,但队列不满,任务放入队列中);
2)如果指定队列大小为10,则最大的10个工作线程来跑;
3)如果指定队列大小为5,则队列满了,后面的线程被reject掉了。[/b]
[b]2. 线程池的参数如下:[/b]
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
说明:
[b] 线程池按以下行为执行任务
1)当线程数小于核心线程数时,创建线程。
2)当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
3)当线程数大于等于核心线程数,且任务队列已满
i)若线程数小于最大线程数,创建线程
ii)若线程数等于最大线程数,抛出异常,拒绝任务[/b]
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);
}
}
结果说明:
[b] 1)如果队列不指定大小,默认大小无限大,这样队列不会满,每次只有三个coreThread来
跑(大于核心线程数,但队列不满,任务放入队列中);
2)如果指定队列大小为10,则最大的10个工作线程来跑;
3)如果指定队列大小为5,则队列满了,后面的线程被reject掉了。[/b]