package thread; import vm.Monitor; import vm.Process; import vm.Scheduler; public class RoundRobinScheduler extends ThreadManager implements Scheduler { private static final int DEFAULT_SEQUENCER_STACK_SIZE = 1024; private boolean started; private int index; private vm.ClockInterruptHandler clockHandler; private Thread thr; public RoundRobinScheduler() { super(); started = false; index = 0; } @Override public Process getNextProcess() { while (true) { thr = threads.get(index); index++; if (index >= threads.size()) { index = 0; } if (thr.state != Thread.FINISHED) { return thr.p; } } } public void start() { if (!started) { int[] sequencerStack = new int[DEFAULT_SEQUENCER_STACK_SIZE]; vm.ClockInterruptHandler.initialize(this, sequencerStack); clockHandler = vm.ClockInterruptHandler.instance; Thread mainThread = new Thread(new vm.Process(null, null)); mainThread.state = Thread.RUNNING; threads.add(mainThread); clockHandler.register(); clockHandler.startClockHandler(mainThread.p); started = true; clockHandler.enable(); clockHandler.yield(); } } public void addThread(Thread thread) { clockHandler.disable(); threads.add(thread); clockHandler.enable(); } public Thread currentThread() { return thr; } public void removeThread(Thread thread) { clockHandler.disable(); threads.remove(thread); clockHandler.enable(); } @Override public void disable() { clockHandler.disable(); } @Override public void enable() { clockHandler.enable(); } @Override public void wait(Object target) { } @Override public void notify(Object target) { } @Override public void notifyAll(Object target) { } @Override public Monitor getDefaultMonitor() { return null; } }