package Transcoder; import java.util.LinkedList; public class Worker extends Thread { private static LinkedList jobs = new LinkedList(); private static Worker[] workers = new Worker[Runtime.getRuntime().availableProcessors()]; private Boolean finished = false; int identifier; static { for(int i = 0; i < workers.length; i++) { workers[i] = new Worker(i); } } /** * NOT designed to have jobs added once the workers are running * Add all jobs to be performed, then set the workers going * @param job */ public static void addJob(Transcode job) { jobs.add(job); } /** * Starts every worker */ public static void goToWork() { for(Worker worker : workers) { worker.start(); } } /** * Waits for every worker to complete */ public static void waitForAll() { for(Worker worker: workers) { worker.waitFor(); } } public Worker(int identifier) { this.identifier = identifier; } public void run() { Transcode currentJob; while((currentJob = getJob()) != null) { System.out.println("Worker #" + identifier + " Starting " + currentJob); currentJob.transcode(); System.out.println("Worker #" + identifier + " Finished " + currentJob + "!"); } finished(); } private Transcode getJob() { Transcode retval = null; synchronized(jobs) { if(jobs.size() > 0) { retval = jobs.removeFirst(); } } return(retval); } private void finished() { synchronized(finished) { finished.notify(); finished = true; } } public void waitFor() { System.out.println("Worker #" + identifier + " waitFor: entering waitFor()"); if(finished) { System.out.println("Worker #" + identifier + " waitFor: already finished, leaving"); return; } System.out.println("Worker #" + identifier + " waitFor: Attempting to grab"); synchronized(finished) { System.out.println("Worker #" + identifier + " waitFor: grabbed! waiting..."); try { finished.wait(); System.out.println("Worker #" + identifier + " waitFor: notified! returning."); } catch (InterruptedException e) { e.printStackTrace(); } } } }