Mercurial > hg > Database > Alice
view src/alice/topology/manager/keeparive/PingScheduler.java @ 303:6e0a909b4b12
add PingScheduler
author | sugi |
---|---|
date | Tue, 19 Nov 2013 14:04:57 +0900 |
parents | |
children | 366742c2b07d |
line wrap: on
line source
package alice.topology.manager.keeparive; import java.util.LinkedList; import java.util.List; import alice.codesegment.CodeSegment; public class PingScheduler extends CodeSegment{ private LinkedList<TaskInfo> list = new LinkedList<TaskInfo>(); private long INTERVAL = 60 * 1000; public boolean updateFlag = false; private boolean interruptFlag = false; private long time = 0; public TaskInfo nowTask; private long totalTime = 0; private long postponeTime = 0; public long getTotalTime(){ return totalTime; } public List<TaskInfo> getTaskList(){ return list; } public synchronized void postpone(String name){ long elapsedTime = System.currentTimeMillis() - time; totalTime += elapsedTime; postponeTime = nowTask.getSleepTime() - elapsedTime; if (name.equals(nowTask.getManagerKey())){ TaskInfo nextTask = list.get(0); nextTask.setSleepTime(postponeTime + nextTask.getSleepTime()); nowTask.setSleepTime(INTERVAL); addTask(nowTask); } else { int cnt = 0; nowTask.setSleepTime(postponeTime); list.add(cnt, nowTask); for (TaskInfo info : list){ if (name.equals(info.getManagerKey())){ if (info != list.getLast()){ TaskInfo nextInfo = list.get(cnt+1); nextInfo.setSleepTime(nextInfo.getSleepTime() + info.getSleepTime()); } list.remove(info); info.setSleepTime(INTERVAL); addTask(info); break; } cnt++; } } interruptFlag = true; notify(); } public synchronized void addTask(TaskInfo newInfo){ if (list.isEmpty()) { list.add(newInfo); } else { int cnt = 0; for (TaskInfo info : list){ if (info.getSleepTime() < newInfo.getSleepTime()){ newInfo.setSleepTime(newInfo.getSleepTime() - info.getSleepTime()); } else if (info.getSleepTime() == newInfo.getSleepTime()){ newInfo.setSleepTime(newInfo.getSleepTime() - info.getSleepTime()); cnt++; break; } else if (info.getSleepTime() > newInfo.getSleepTime()){ info.setSleepTime(info.getSleepTime() - newInfo.getSleepTime()); break; } cnt++; } list.add(cnt, newInfo); } updateFlag = true; } @Override public synchronized void run() { try { while(true){ nowTask = list.poll(); time = System.currentTimeMillis(); if (nowTask.getSleepTime()!=0) this.wait(nowTask.getSleepTime()); if (interruptFlag){ interruptFlag = false; } else { ods.put("_SENDPING", nowTask); totalTime +=nowTask.getSleepTime(); } } } catch (InterruptedException e) { } } }