目录
线程应用实例
等待超时模式
开发人员经常会遇到这样的方法调用场景:调用一个方法时等待一段时间(一般来说是给 定一个时间段),如果该方法能够在给定的时间段之内得到结果,那么将结果立刻返回,反之, 超时返回默认结果。
前面的章节介绍了等待/通知的经典范式,即加锁、条件循环和处理逻辑3个步骤,而这种 范式无法做到超时等待。而超时等待的加入,只需要对经典范式做出非常小的改动,改动内容 如下所示。
假设超时时间段是T, 那么可以推断出在当前时间NOW+T之后就会超时。 定义如下变量。
·等待持续时间: REMAINING=T。
·超时时间: FUTURE=now+ T。
这时仅需要wait(REMAINING)即可,在wait(REMAINING)返回之后会将执行:
REMAINING=FUTURE一now。如果REMAINING小于等于0, 表示已经超时,直接退出,否则将 继续执行wait(REMAINING)。
上述描述等待超时模式的伪代码如下。
可以看出,等待超时模式就是在等待/通知范式基础上增加了超时控制,这使得该模式相 比原有范式更具有灵活性,因为即使方法执行时间过长,也不会“永久"阻塞调用者,而是会按 照调用者的要求”按时“返回。
一个简单的数据库连接池示例
我们使用等待超时模式来构造一个简单的数据库连接池,在示例中模拟从连接池中获 取、使用和释放连接的过程,而客户端获取连接的过程被设定为等待超时的模式,也就是在 1000毫秒内如果无法获取到可用连接,将会返回给客户端一个null。设定连接池的大小为10 个,然后通过调节客户端的线程数来模拟无法获取连接的场景。
首先看一下连接池的定义。它通过构造函数初始化连接的最大上限,通过一个双向队列 来维护连接,调用方需要先调用fetchConnecti on(long)方法来指定在多少毫秒内超时获取连接, 当连接使用完成后,需要调用releaseConnecti on(Connection)方法