高级线程之线程池

高级线程之线程池

1. 线程池产生

为什么会出现线程池?
在普通情况下,我们需要创建并启动一个线程,当任务完成时,我们将其销毁,这样存在两个不断重复的过程(创建和销毁)
解决方案:我们创建一个线程池,当我们需要使用进程时,从进程池中调用一个,使用完时又将其返回线程池中,这样就避免了两个重复的过程

2. 线程池的分类

* 固定尺寸线程池
//创建线程池
ExcutorService tp=Excutor.newFixedThreadPool(N)  //N--线程池的大小(可用线程数目)
Thread1 a= new Thread1();
tp.execute(a);    //执行线程
tp.shutdown();   //关闭线程池

Q:写代码时可以execute超过n个线程吗?
A:可以,但是由于线程池中只有两个待命线程,所以只有在其中一个线程结束后将其返回线程池才可运行第三个,后面的亦然

* 可变尺寸线程池
ExcutorService tp=Excutor.newCachedThreadPool();
Thread1 a=new Thread1();
tp.execute(a);
tp.shutdown();

3. 线程池的延迟执行

//类
ScheduledExecutorService //实现了时延功能的线程池
//构造器
public static ScheduledExecutorService newScheduledThreadPoll(int n)
public static ScheduledExecutorService newSingleThreadScheduledExecutor()  //顾名思义,单线程线程池
//API:
public ScheduledFuture schedule(Runable command,long delay,TimeUnit unit)    //设定线程延迟执行时间

4. 自定义线程池

//类
ThreadPoolExecutor
//构造器
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runable> workQueue)
//需要为这个类的对象指定两个值:标准尺寸和最大尺寸,原因在于线程调度的需要,如果请求线程数在最大值之内,都是原则上允许创建新线程的,如果要超过标准值,一般倾向于将请求放到队列中。
posted @ 2017-05-24 21:49  江南何采莲  阅读(218)  评论(0编辑  收藏  举报