public class SocketTimer extends Thread { /** キー */ private SelectionKey key; /** セレクタ */ private Selector selector; /** タイムアウト通知フラグ */ private boolean timeoutFlag; /** タイマー値(秒) */ private int timerValue; /** タイムアウト表記(ログ出力用) */ private static final int TIMEOUT_STAT_OUT = 1; /** * コンストラクタ<br> * @param key キー * @param value タイムアウト値(秒) */ public SocketTimer(SelectionKey key, int value) { // パラメータをプロパティに設定 this.key = key; this.selector = key.selector(); this.timeoutFlag = true; this.timerValue = value; } /** * タイマー実行<br> */ public void run() { try { // スリープする Thread.sleep(this.timerValue * 1000); synchronized(this) { // タイムアウト通知をする if (this.timeoutFlag) { Map map = (Map) key.attachment(); SocketTimerInfo socketTimerInfo = (SocketTimerInfo) map.get(SocketControl.KEY_TIMER); socketTimerInfo.setFlag(TIMEOUT_STAT_OUT); key.attach(map); this.selector.wakeup(); } } } catch (InterruptedException e) { Log log = LogFactory.getLog(SocketTimer.class); log.fatal(e); } catch (Exception e) { Log log = LogFactory.getLog(SocketTimer.class); log.fatal(e); } } /** * タイマー解除<br> */ public synchronized void stopTimer() { this.timeoutFlag = false; } }