高级线程之线程池
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)
//需要为这个类的对象指定两个值:标准尺寸和最大尺寸,原因在于线程调度的需要,如果请求线程数在最大值之内,都是原则上允许创建新线程的,如果要超过标准值,一般倾向于将请求放到队列中。