public static void main(String[] args) throws InterruptedException {
        
        //Setup Configuration
        int totalJobs = 50000;
        int currentJobsLimit = 25;
        int totalPoolObjs = 25;
        final int timeDelay = 100;
        
        //Feed ObjectPool Reusable Thread Specific Objects (Usually Conns or PS's )
        final ObjectPool<String> pool = new ObjectPool<String>();
        for (int i = 0; i < totalPoolObjs; i++) {pool.put("obj"+i);}

        //Create Jobs
        List<Job> jobs = new ArrayList<Job>();
        for (int i = 0; i < totalJobs; i++) {
            final int ii =i;
            
            class Job1 extends Job{
                String sPool;
                
                @Override public void execute() {
                    
                    try {
                        sPool=pool.pop();
                    } catch (Exception e) {
                        //No se pudo obtener recursod e Pool
                        setName(String.valueOf(ii+" Error "+e));
                        return;
                    }
                    setName(String.valueOf(ii+" "+sPool));
                    try {Thread.sleep(new Random().nextInt(timeDelay));} catch (InterruptedException ex) {}
                    
                }
            
                //Do some cleanUp after Job Finish
                @Override public void cleanUp() {
                    //Regresa objeto a Pool y notifica si alguien mas en su espera
                    pool.putNotify(this.sPool);
                }
                
            }
            
            Job j = new Job1();
            jobs.add(j);
        }
        
        for (Job job : jobs) {job.setName("");}
        
        //Create JobRunner
        ListJobRunner jr = new ListJobRunner(jobs);
        
        //Sepcify concurrent Jobs
        jr.setLimit(currentJobsLimit);
        
        //Assign to JobManager
        JobManager mgr = new JobManager(jr);
        mgr.addJobManagerHasFinishedListener(new JobListener() {
            @Override public void jobHasFinished(JobEvent evt) { System.out.println("All Jobs Finished"); }
        });
        
        mgr.runJobs();
        
    }