Javaの「タイムアウト待ち」メカニズム

1589 ワード

前編では「通知待ち」メカニズムを記録したが,スレッドをずっと待たせることはできず,本稿では「タイムアウト待ち」メカニズムを記録する.データベースを接続するときによく使われます.
「待機タイムアウト」メカニズムの標準仕様
現在時刻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();
				}
			}
		}
	}
}