java线程池简单理解(线程池7大参数、线程池原理、线程复用、线程池工作过程)

java线程池简单理解

线程池7大参数

  • corePoolSize:指定了线程池中的线程数量
  • maximunPoolSize:指定了线程池中最大线程数量
  • keepAliveTime:当前线程池数量超过corePoolSize时,多余的空闲线程的存活时间。
  • unit:keepAliveTime的单位
  • workQueue:任务队列,被提交但尚未被执行的任务
  • handler:拒绝策略,当任务太多来不及处理,如何拒绝任务

ThreadPoolExecutor 的构造方法如下:

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}

线程池原理

线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。他的主要特点为:

  • 线程复用
  • 控制最大并发数
  • 管理线程

线程复用

每一个Thread的类都有一个start方法。当调用start启动线程时java虚拟机会调用该类的run方法。那么该类的run()方法中就是调用了Runable对象的run()方法。我们可以继承重写Thread类,在其start方法中不断循环调用传递过来的Runnable对象。这就是线程池的实现原理。循环方法中不断获取的Runnable是用Queue实现的,在获取下一个Runnable之前可以是阻塞的。

线程池工作过程

1、线程创建时,里面没有一个线程。任务队列是作为参数传进来的,不过,就算队列里面有任务,线程也不会马上执行他们。
2、当调用exectue方法添加一个任务时,线程会做出如下判断:
a)如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务;
b)如果正在运行的线程数量大于或等于corePoolSize,那么讲这个任务放入队列;
c)如果这个时候队列满了,而且正在运行的线程数量小于maximumPoolSize,那么还是创建非核心线程立刻运行这个任务;
如果队列满了,而且正在运行的线程数量大于或等于maximumPoolSize,那么线程会抛出异常RejectExecutionException。
3、当一个线程完成任务时,它会从队列中取下一个任务来执行。
4、当一个线程无事可做,超过一定时间(keepAliveTime)时,线程池会做出判断,如果当前运行的线程数大于corePoolSize,那么这个线程就会被停掉。所以线程池的所有任务完成后,他最终会收缩到corePoolSize的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值