public void runJobs(){
        final JobManager thisManager = this;
        if(jobRunner==null) throw new IllegalStateException("No existe un JobRunner asignado a este manager");
        
        int i =0;
        Job nextJob = jobRunner.getNextJob();
        while(nextJob!=null){
            
            final Job actualJob =nextJob;
            
            //Do CleanUp upon Job Finish
            nextJob.addJobHasFinishedListener(new JobListener() {
                @Override public void jobHasFinished(JobEvent evt) {
                    actualJob.cleanUp();
                    //System.out.println("JobFinished:"+actualJob.getName()+" "+(jobsRunned-jobsFinished));
                    thisManager.jobFinished(actualJob);
                }
            });
            
            if(nextJob.getName()==null) nextJob.setName("Job"+System.currentTimeMillis());
            new Thread(nextJob,nextJob.getName()).start();
            i++;jobsRunned++;
            if(jobRunner.halt()) {
                synchronized(jobRunner){
                    try {jobRunner.wait();} catch (InterruptedException ex) {}
                } 
            }
            
            nextJob = jobRunner.getNextJob();
        }
        //noMoreJobs
        noMoreJobs=true;
    }