更新时间:2017-07-02 来源:黑马程序员Android+物联网培训学院 浏览量:
cpu
资源
时间片
,系统通过一种循环的方式为线程提供时间片,线程在自己的时间内运行,因为时间相当短,多个线程频繁地发生切换,因此给用户的感觉就是好像多个线程同时运行一样,但是如果计算机有多个CPU,线程就能真正意义上的同时运行了.
减少频繁的创建和销毁对象。
提供了一些静态方法,帮助我们方便的生成一些常用的线程池
,ThreadPoolExecutor是Executors类的底层实现//
构造方法
public ThreadPoolExecutor(int corePoolSize
,
//
核心池的大小
int maximumPoolSize
,
//
线程池最大线程数
long keepAliveTime
,
//
保持时间
TimeUnit unit
,
//
时间单位
BlockingQueue<Runnable> workQueue
,
//
任务队列
ThreadFactory threadFactory
,
//
线程工厂
RejectedExecutionHandler handler) //
异常的捕捉器
核心池的大小
,这个参数跟后面讲述的线程池的实现原理有非常大的关系。在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程或者一个线程。默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中;线程池最大线程数
,这个参数也是一个非常重要的参数,它表示在线程池中最多能创建多少个线程;表示线程没有任务执行时最多保持多久时间会终止
。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize,即当线程池中的线程数大于corePoolSize时,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。但是如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0;时间单位
,有7种取值·
TimeUnit.DAYS; //
天
·
TimeUnit.HOURS; //
小时
·
TimeUnit.MINUTES; //
分钟
·
TimeUnit.SECONDS; //
秒
·
TimeUnit.MILLISECONDS; //
毫秒
·
TimeUnit.MICROSECONDS; //
微妙
·
TimeUnit.NANOSECONDS; //
纳秒
任务队列
,是一个阻塞队列,用来存储等待执行的任务,这个参数的选择也很重要,会对线程池的运行过程产生重大影响,参考BlockingQueue·
ArrayBlockingQueue;
·
LinkedBlockingQueue;
·
SynchronousQueue;
线程工厂
,如何去创建线程的异常的捕捉器
,参考 RejectedExecutionHandler·
ThreadPoolExecutor.AbortPolicy:
丢弃任务并抛出
RejectedExecutionException
异常。
·
ThreadPoolExecutor.DiscardPolicy
:也是丢弃任务,但是不抛出异常。
·
ThreadPoolExecutor.DiscardOldestPolicy
:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
·
ThreadPoolExecutor.CallerRunsPolicy
:由调用线程处理该任务
corePoolSize
)个工人,每个工人同时只能做一件任务。来了任务就分配
给空闲的工人做;任务队列
);创建新线程
)进来;然后就将任务也分配给这4个临时工人做;拒绝执行
)。空闲时间
),新任务增长的速度又比较缓慢,工厂主管可能就考虑辞掉4个临时工了,只保持原来的10个工人,毕竟请额外的工人是要花钱的ArrayBlockingQueue(
有界队列
)
: FIFO 队列,规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小LinkedBlockingQueue(
无界队列
)
:FIFO 队列,大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定。PriorityBlockingQueue
:优先级队列, 类似于LinkedBlockingQueue,但队列中元素非 FIFO, 依据对象的自然排序顺序或者是构造函数所带的Comparator决定的顺序SynchronousQueue(
直接提交策略
)
: 交替队列,队列中操作时必须是先放进去,接着取出来
,交替着去处理元素的添加和移除,这是一个很有意思的阻塞队列,其中每个插入操作必须等待另一个线程的移除操作,同样任何一个移除操作都等待另一个线程的插入操作。因此此队列内部其 实没有任何一个元素,或者说容量是0,严格说并不是一种容器。由于队列没有容量,因此不能调用peek操作,因为只有移除元素时才有元素。抛出异常
直接执行
加入的任务移除第一个任务,执行加入的任务
不做处理
【AI设计】北京143期毕业仅36天,全员拿下高薪offer!黑马AI设计连续6期100%高薪就业
2025-09-19【跨境电商运营】深圳跨境电商运营毕业22个工作日,就业率91%+,最高薪资达13500元
2025-09-19【AI运维】郑州运维1期就业班,毕业14个工作日,班级93%同学已拿到Offer, 一线均薪资 1W+
2025-09-19【AI鸿蒙开发】上海校区AI鸿蒙开发4期5期,距离毕业21天,就业率91%,平均薪资14046元
2025-09-19【AI大模型开发-Python】毕业33个工作日,就业率已达到94.55%,班均薪资20763元
2025-09-19【AI智能应用开发-Java】毕业5个工作日就业率98.18%,最高薪资 17.5k*13薪,全班平均薪资9244元
2025-09-19