Java_多线程2_线程池

线程池(pool):

线程池的作用:

1、节省资源,减少线程的数量和创建销毁线程的开销
2、合理的管理线程的分配

线程池的创建:
1、newCachedThreadPool   //优点:很灵活,弹性的线程管理,需要多少线程就给多大的线程池
                        缺点:如果线程无限增长,会导致内存溢出
2、newFixedThreadPool    //优点:创建一个固定大小的线程池,超出的任务会在队列中等待
                                   缺点:难以扩展,不支持自定义 拒绝策略
3、newScheduledThreadPool  //优点:支持周期性的执行任务,固定大小
                            缺点: 单线程执行,一旦一个任务失败会影响其他任务执行
4、newSingleThreadExecutor  //优点:能够顺序执行任务
                             缺点:不明白怎么设计的,可以使用队列来执行
5、ThreadPoolExecutor    //优点:上面所有的优点
使用newFixedThreadPool创建一个固定大小的线程池:
ExecutorService fixPool =Executors.newFixedThreadPool(5);

for (int i=0;i<20;i++) {
fixPool.execute(new MyRunnable()); //execute:执行一个任务
{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
}
fixPool.shutdown(); //中断线程池,没有任务执行时要中断线程池

使用
ThreadPoolExecutor创建一个的核心池:
ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 5, 5, TimeUnit.SECONDS,new LinkedBlockingDeque<Runnable>(20),new ThreadPoolExecutor.AbortPolicy());
pool.execute(new MyRunnable()); //将一个实现线程接口的任务类交给核心池
核心池类的参数:
corePoolSize(3):核心池的大小
maximumPoolSize(5):池内线程的最大值
keepAliveTime(5):线程的存活时间
Unit(TimeUnit.SECONDS): 上述时间的单位
BlockingQueue(new LinkedBlockingDeque<Runnable>(20)):队列,如果有任务需要等待线程执行,就会临时存储在这个队列中,(20:队列容量)
RejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()):拒绝策略
拒绝策略:
1、Abortpolicy:丢弃任务并抛出异常
2、Discardpolicy:丢弃任务,但不抛出异常
3、Discardoldestpollicy:丢弃队列最前面的任务,尝试重新
4、CallerRunsPolicy:谁把任务给我,谁来执行


 
 
 
原文地址:https://www.cnblogs.com/zhouchangyang/p/10627408.html