什么是线程池:
线程池就是控制线程的一个池子。用来控制线程数量。
为什么要使用线程池:
1.避免系统重复创建和销毁线程影响运行的时间(创建+销毁>>执行时间时)
2.控制线程数量,线程过多会导致机器运行卡(大约一个线程占用1M空间)
ThreadPoolExecutor构造方法
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
参数1:核心线程池大小(标准大小)
参数2:线程池最大大小
参数3:设置多长时间超时回收线程
参数4:是一个枚举,表示 keepAliveTime 的单位
参数5:存放任务的队列
实例
public class ThreadPoolExecutorDemo { 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(5000);} catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } }); } System.out.println("-----------------------------------------------"); for(int i=0;i<20;i++){ executor.submit(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); } executor.shutdown(); } }
线程池在执行线程时会做出如下判断:
1.如果线程数小于核心线程,那么创建并执行这个县城
2.如果线程数大于核心线程则放入队列中
3.如果这时队列满了,并且小于最大线程数,那么创建执行这个线程
4.如果队列满了,并且大于最大线程数,那么抛异常。
当线程闲来无事时,超过了回收时间,并且线程池数量大于核心数量,那么就回收,直到回到核心线程数量
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-06 00:54:05