X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Fglobal%2FJobQueue.java;h=326f702f5ec0e56f720e24f993bd97548bfa3c58;hb=53f90aac81d2c47624f5a1a6d61a796355d2345f;hp=c62181b996763d9d75fdbbcd29bf125c06518d6e;hpb=2b0e1c1d91eea7e201af61e1065ad12bf966d1ba;p=mir.git diff --git a/source/mircoders/global/JobQueue.java b/source/mircoders/global/JobQueue.java index c62181b9..326f702f 100755 --- a/source/mircoders/global/JobQueue.java +++ b/source/mircoders/global/JobQueue.java @@ -38,14 +38,14 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Vector; +import java.util.ArrayList; import mir.log.LoggerWrapper; // important: objects passed as data must not be altered once put into a job public class JobQueue { - private Vector jobHandlers; + private List jobHandlers; private Map identifierToJobHandler; private int nrJobs; private int jobCleanupTreshold; @@ -69,13 +69,14 @@ public class JobQueue { public JobQueue(LoggerWrapper aLogger) { logger = aLogger; - jobHandlers = new Vector(); + jobHandlers = new ArrayList(); identifierToJobHandler = new HashMap(); nrJobs = 0; lastCleanup = 0; jobCleanupTreshold = 900; // seconds queueRunner = new JobQueueRunner(logger); thread = new Thread(queueRunner); + thread.setDaemon(true); thread.start(); } @@ -95,12 +96,14 @@ public class JobQueue { identifierToJobHandler.put(jobHandler.getIdentifier(), jobHandler); jobHandler.setPending(); + jobHandlers.notify(); + return jobHandler.getIdentifier(); } } public List getJobsInfo() { - List result = new Vector(); + List result = new ArrayList(); synchronized (jobHandlers) { Iterator i = jobHandlers.iterator(); @@ -114,7 +117,8 @@ public class JobQueue { } private void cleanupJobList() { - List toRemove = new Vector(); + List toRemove = new ArrayList(); + synchronized (jobHandlers) { Iterator i = jobHandlers.iterator(); @@ -138,21 +142,31 @@ public class JobQueue { lastCleanup = System.currentTimeMillis(); } - private JobHandler acquirePendingJob() { - synchronized (jobHandlers) { - int priorityFound= 0; - JobHandler jobFound; + /** + * Returns when a new producer job has become available + */ + private JobHandler acquirePendingJob() throws InterruptedException { + int priorityFound= 0; + JobHandler jobFound; - jobFound = null; - Iterator i = jobHandlers.iterator(); - while (i.hasNext()) { - JobHandler job = (JobHandler) i.next(); + synchronized (jobHandlers) { + do { + jobFound = null; + Iterator i = jobHandlers.iterator(); + while (i.hasNext()) { + JobHandler job = (JobHandler) i.next(); + + if (job.isPending() && (jobFound==null || priorityFoundtrue if terminated normally, false if aborted */ boolean run(); @@ -386,18 +413,16 @@ public class JobQueue { try { while (true) { - JobHandler job = acquirePendingJob(); - if (job != null) { + try { + JobHandler job = acquirePendingJob(); + logger.debug(" starting job ("+job.getIdentifier()+"): " +job.getDescription()); job.runJob(); logger.debug(" finished job ("+job.getIdentifier()+"): " +job.getDescription()); + + job=null; } - else { - try { - Thread.sleep(1500); - } - catch (InterruptedException e) { - } + catch (InterruptedException e) { } } }