/** * Creates new instance of scheduler. */ public PriorityQueueScheduler(Clock clock) { this.clock = clock; for(int i=0;i<taskQueues.length;i++) { taskQueues[i]=new OrderedTaskQueue(); } for(int i=0;i<heartBeatQueue.length;i++) { heartBeatQueue[i]=new OrderedTaskQueue(); } coreThread = new CoreThread("scheduler-core"); criticalThread = new CriticalThread("scheduler-critical"); workerThreads=new WorkerThread[Runtime.getRuntime().availableProcessors()*2]; criticalWorkerThreads=new CriticalWorkerThread[Runtime.getRuntime().availableProcessors() / 2]; for(int i=0;i<workerThreads.length;i++) { workerThreads[i] = new WorkerThread("scheduler-worker-" + i); } for(int i=0;i<criticalWorkerThreads.length;i++) { criticalWorkerThreads[i] = new CriticalWorkerThread("scheduler-critical-worker-" + i); } }
/** * Starts scheduler. */ public void start() { if(this.isActive) return; if (clock == null) { throw new IllegalStateException("Clock is not set"); } this.isActive = true; logger.info("Starting "); coreThread.activate(); criticalThread.activate(); for(int i=0;i<workerThreads.length;i++) workerThreads[i].activate(); for(int i=0;i<criticalWorkerThreads.length;i++) criticalWorkerThreads[i].activate(); logger.info("Started "); }
while(currQueue<=OUTPUT_QUEUE) executeQueue(taskQueues[currQueue]); while(activeTasksCount.get()!=0) LockSupport.park(); executeQueue(taskQueues[MANAGEMENT_QUEUE]); while(activeTasksCount.get()!=0) LockSupport.park(); executeQueue(heartBeatQueue[runIndex]); while(activeTasksCount.get()!=0) LockSupport.park(); executeQueue(taskQueues[MANAGEMENT_QUEUE]); while(activeTasksCount.get()!=0) LockSupport.park(); if(cycleDuration<20000000L) try { sleep(20L-cycleDuration/1000000L,(int)((20000000L-cycleDuration)%1000000L));
public void run() { while(active) { current=null; while(current==null) { try { current=waitingTasks.take(); } catch(Exception ex) { logger.warn("Could not poll waiting task in timely fashion. Will keep trying."); } } current.run(); coreThread.notifyCompletion(); } }
public void activate() { this.active = true; this.start(); }