开发人员经常会遇到这样的方法調用场景:调用一个方法时等待一段时间(一般来说是给定一个时间段)如果该方法能够在给定的时间段之内得到结果,那么将结果立刻返回反之,超时返回默认结果等待/通知的经典范式,即加锁、条件循环和处理逻辑3个步骤而这种范式无法做到超时等待。而超时等待的加入只需要对经典范式做出非常小的改动,改动内容如下所示假设超时时间段是T,那么可以推断出在当前时间now+T之后就会超时定義如下变量
等待超时模式就是在等待/通知范式基础上增加了超时控制,这使得该模式相比原有范式更具有灵活性因为即使方法执行时間过长,也不会“永久”阻塞调用者而是会按照调用者的要求“按时”返回。
数据库连接池的设计也可以复用到其他的资源获取的场景针对昂贵资源(比如数据库连接)的获取都应该加以超时限制。
对于服务端的程序经常面对的是客户端传入的短小(执行时间短、工莋内容较为单一)任务,需要服务端快速处理并返回结果如果服务端每次接受到一个任务,创建一个线程超时然后进行执行,这在原型阶段是个不错的选择但是面对成千上万的任务递交进服务器时,如果还是采用一个任务一个线程超时的方式那么将会创建数以万记嘚线程超时,这不是一个好的选择因为这会使操作系统频繁的进行线程超时上下文切换,无故增加系统的负载而线程超时的创建和消亡都是需要耗费系统资源的,也无疑浪费了系统资源
线程超时池技术能够很好地解决这个问题,它预先创建了若干数量的线程超时并苴不能由用户直接对线程超时的创建进行控制,在这个前提下重复使用固定或较为固定数目的线程超时来完成任务的执行这样做的好处昰,一方面消除了频繁创建和消亡线程超时的系统资源开销,另一方面面对过量任务的提交能够平缓的劣化。
线程超时池的本质就是使用了一个线程超时安全的工作队列连接工作者线程超时和客户端线程超时客户端线程超时将任务放入工作队列后便返回,而工作者线程超时则不断地从工作队列上取出工作并执行当工作队列为空时,所有的工作者线程超时均等待在工作队列上当有客户端提交了一个任务之后会通知任意一个工作者线程超时,随着大量的任务被提交更多的工作者线程超时会被唤醒。
线程超时池中线程超时数量并不是樾多越好具体的数量需要评估每个任务的处理时间,以及当前计算机的处理器能力和数量使用的线程超时过少,无法发挥处理器的性能;使用的线程超时过多将会增加系统的无故开销,起到相反的作用