Javaの「タイムアウト待ち」メカニズム
1589 ワード
前編では「通知待ち」メカニズムを記録したが,スレッドをずっと待たせることはできず,本稿では「タイムアウト待ち」メカニズムを記録する.データベースを接続するときによく使われます.
「待機タイムアウト」メカニズムの標準仕様
現在時刻now
待ち時間T
now+T時間を超えるとタイムアウトovertime
残り時間はretime
while(判断条件が満たされていない&retime>0){
wait(retime);//待ち受ける
retime= overtime - now;//残り時間の更新
}
アナログデータベース接続
「待機タイムアウト」メカニズムの標準仕様
現在時刻now
待ち時間T
now+T時間を超えるとタイムアウトovertime
残り時間はretime
while(判断条件が満たされていない&retime>0){
wait(retime);//待ち受ける
retime= overtime - now;//残り時間の更新
}
アナログデータベース接続
package com.zc;
import java.sql.Connection;
import java.util.LinkedList;
public class DBPool {
//
private static LinkedList pool = new LinkedList();
//
public void DBPool(int init) {
if(init>0) {
for (int i = 0; i < init; i++) {
pool.addLast(ConnectionUtils.getConnection());
}
}
}
// mills
public Connection getConnection(long mills) throws InterruptedException {
synchronized (pool) {
//mills 0,
if(mills < 0){
while(pool.isEmpty()){
pool.wait();
}
return pool.removeFirst();
}else {
//
long overtime = System.currentTimeMillis() + mills;
//
long retime = mills;
// 0
while(pool.isEmpty() && retime > 0){
pool.wait(retime);
// ,
retime = overtime - System.currentTimeMillis();
}
Connection conn = null;
if(!pool.isEmpty()){
conn = pool.removeFirst();
}
return conn;
}
}
}
//
public void returnConnection(Connection conn) {
if(conn!=null) {
synchronized (pool) {
if(conn != null){
pool.addFirst(conn);
pool.notifyAll();
}
}
}
}
}