线程池

创建对象,仅仅是在JVM的堆内存里分配一块内存;

创建一个线程,需要调用操作系统内核的API,然后操作系统要为线程分配一系列资源。所以线程是一个重量级对象,应避免频繁的创建和销毁。

如何使用Java中的线程池?

核心工具类ThreadPoolExecutor

ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

corePoolSize:线程池保有的最小线程数(除非设置了allowCoreThreadTimeOut参数)

maximumPoolSize:线程池创建的最大线程数

keepAliveTime&unit:如果一个线程空闲了keepAliveTime&unit这么久,且线程池的线程数大于corePoolSize,那么空闲的线程就要被回收了

workQueue:工作队列

threadFactory:通过这个参数可以自定义如何创建线程,例如可以给线程指定一个有意义的名字

handler:可以自定义任务的拒绝策略;如果线程池中的线程都在忙碌,并且工作队列也满了(有界队列),此时再提交任务,线程池就会拒绝接收

ThreadPoolExecutor提供了以下4种策略:

  • CallerRunsPolicy:提交任务的线程自己去执行该任务;
  • AbortPolicy:默认的拒绝策略,throws RejectedExecutionException
  • DiscardPolicy:直接丢弃任务,没有异常抛出
  • DiscardOldestPolicy:丢弃最老的任务;把最早进入工作队列的任务丢弃,把新任务加入到工作队列

Java1.6版本增加了 allowCoreThreadTimeOut(boolean value)方法,可以支持所有线程都超时。

 

不建议使用Executors的原因:提供的许多方法默认使用的是无界的LinkedBlockingQueue,高负载情况下,无界队列容易导致OOM,而OOM会导致所有请求都无法处理。所以强烈建议使用有界队列。

使用有界队列,当任务过多时,线程池会触发执行拒绝策略,线程池默认的拒绝策略会throws RejectedExecutionException,这是个运行时异常,对于运行时异常编译器并不强制catch它,所以开发人员很容易忽略。因此默认拒绝策略要慎重使用,建议自定义自己的拒绝策略。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值