A work queue is used to coordinate work between a producer and a set of worker threads.
import java.util.LinkedList; public class Main { public static void main(String[] argv) { WorkQueue queue = new WorkQueue(); int numWorkers = 2; Worker[] workers = new Worker[numWorkers]; for (int i = 0; i < workers.length; i++) { workers[i] = new Worker(queue); workers[i].start(); } for (int i = 0; i < 100; i++) { queue.addWork(i); } } } class WorkQueue { LinkedList<Object> queue = new LinkedList<Object>(); public synchronized void addWork(Object o) { queue.addLast(o); notify(); } public synchronized Object getWork() throws InterruptedException { while (queue.isEmpty()) { wait(); } return queue.removeFirst(); } } class Worker extends Thread { WorkQueue q; Worker(WorkQueue q) { this.q = q; } public void run() { try { while (true) { Object x = q.getWork(); if (x == null) { break; } System.out.println(x); } } catch (InterruptedException e) { } } }