Java原生线程池原理

Executor框架主要由三个部分组成:任务,任务的执行,异步计算的结果。
主要的类和接口简介如下:
1. Executor是一个接口,它将任务的提交和任务的执行分离。
2. ThreadPoolExecutor是线程池的核心,用来执行被提交的类。
3. Future接口和实现Future接口的FutureTask类,代表异步计算的结果。
4. Runnable接口和Callable接口的实现类,都可以被ThreadPoolExecutor或其他执行。

1. FixedThreadPool

Java中最直接的使用方法就是和 Runtime.getRuntime().availableProcessors() 一起使用分配处理器个数个的Executor。内部结构大致如下:
这里写图片描述
创造实例的函数为: Executors.newFixedThreadPool(int nThread);

在JDK1.7里java.util.concurrent包中的源码中队列使用的是new LinkedBlockingQueue,这是一个无界的队列,也就是说任务有可能无限地积压在这个等待队列之中,实际使用是存在一定的隐患。但是构造起来相当比较容易,我个人建议在使用的过程之中不断查询size()来保证该阻塞队列不会无限地生长。

2. SingleThreadExecutor

和 Executors.newFixedThreadPool(1) 完全等价。

3. CachedThreadPool

和之前两个实现类完全不同的是,这里使用SynchronousQueue替换LinkedBlockingQueue。简单提一下SynchronousQueue是一个没有容量的队列,一个offer必须对应一个poll,当然所谓poll操作是由实际JVM工作线程来进行的,所以对于使用开发者来讲,这是一个会因为工作线程饱和而阻塞的线程池。(这个和java.util.concurrent.Exchanger的作用有些相似,但是Exchanger只是对于两个JVM线程的,而SynchronousQueue的阻塞机制是多个生产者和多个消费者而言的。

4. ScheduledThreadPoolExecutor

这个实现类内部使用的是DelayQueue。DelayQueue实际上是一个优先级队列的封装。时间早的任务会拥有更高的优先级。它主要用来在给定的延迟之后运行任务,或者定期执行任务。ScheduledThreadPoolExecutor的功能与Timer类似,但ScheduledThreadPoolExecutor比Timer更加灵活,而且可以有多个后台线程在构造函数之中指定。
  

Future接口和ListenableFurture接口

Future接口为异步计算取回结果提供了一个存根(stub),然而这样每次调用Future接口的get方法取回计算结果往往是需要面临阻塞的可能性。这样在最坏的情况下,异步计算和同步计算的消耗是一致的。Guava库中因此提供一个非常强大的装饰后的Future接口,使用观察者模式为在异步计算完成之后马上执行addListener指定一个Runnable对象,从实现“完成立即通知”

常见Queue总结:
这里写图片描述
说明:
ThreadPoolExecutor aPool = new ThreadPoolExecutor(10,20,5,TimeUnit.MINUTES,new SynchronousQueue());
ThreadPoolExecutor bPool = new ThreadPoolExecutor(10,20,5,TimeUnit.MINUTES,new ArrayBlockingQueue(10));
SynchronousQueue是一个很特殊的Queue,当往这个Queue放东西时,必须有另外一个线程在从这个Queue里拿,如没有,则直接失败,在上面的场景中,当第11个请求进来时,往这个Queue中放就将失败,而这个时候运行的线程数又小于maxPoolSize,因此将启动新线程进行处理。

而bPool采用的是ArrayBlockingQueue,put将成功,可见在bPool的情况下,想要运行的线程数增加到11个,必须是10个线程已经在处理中,并且ArrayBlockingQueue已经排队了10个请求,那么这个时候如果再有第21个请求进来,才会启动第11个线程进行处理,刚用这个API时,很容易会认为只有当线程数已经达到了maxPoolSize后才会往Queue里放。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值