什么是线程池:
线程池就是控制线程的一个池子。用来控制线程数量。
为什么要使用线程池:
1.避免系统反复创建和销毁线程影响执行的时间(创建+销毁>>执行时间时)
2.控制线程数量。线程过多会导致机器执行卡(大约一个线程占用1M空间)
ThreadPoolExecutor构造方法
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
參数1:核心线程池大小(标准大小)
參数2:线程池最大大小
參数3:设置多长时间超时回收线程
參数4:是一个枚举,表示 keepAliveTime 的单位
參数5:存放任务的队列
实例:
public classThreadPoolExecutorDemo { public static void main(String[] args) { //LinkedBlockingDeque线程队列大小无限制,不会抛异常 BlockingQueue<Runnable> queue = new LinkedBlockingDeque<Runnable>(); //假设核心线程和最大线程同样,那么该线程是固定大小线程池。 ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 6, 1, TimeUnit.DAYS, queue); for(int i=0;i<20;i++){ executor.execute(new Runnable() { @Override public void run() { try {Thread.sleep(1000);} catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } }); } //有序的关闭,已经关闭的无其它作用 executor.shutdown(); } }
线程池在运行线程时会做出例如以下推断:
1.假设线程数小于核心线程。那么创建并运行这个县城
2.假设线程数大于核心线程则放入队列中
3.假设这时队列满了,而且小于最大线程数,那么创建运行这个线程
4.假设队列满了,而且大于最大线程数。那么抛异常。
当线程闲来无事时,超过了回收时间,而且线程池数量大于核心数量。那么就回收,直到回到核心线程数量