package multithread; import java.util.LinkedList; public class WorkQueue { private final int nThreads; private final PoolWorker[] threads; private final LinkedList queue; public WorkQueue(int nThreads) { this.nThreads = nThreads; queue = new LinkedList(); threads = new PoolWorker[nThreads]; for (int i = 0; i < nThreads; i++) { threads[i] = new PoolWorker(); threads[i].start();// 启动所有工作线程 } } public void execute(Runnable r) { synchronized (queue) { queue.addLast(r); queue.notify(); } } private class PoolWorker extends Thread { @Override public void run() { Runnable r = null; while (true) { synchronized (queue) { while (queue.isEmpty()) {// 如果任务队列中没有任务,等待 try { queue.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } r = (Runnable) queue.removeFirst();// 有任务时,取出任务 // If we don't catch RuntimeException, // the pool could leak threads try { r.run();// 执行任务 } catch (RuntimeException e) { e.printStackTrace(); } } } } } public static void main(String[] args) { WorkQueue wq = new WorkQueue(3); MyTask t[] = new MyTask[20]; for (int i = 0; i < t.length; i++) { t[i] = new MyTask(); wq.execute(t[i]); } } } class MyTask implements Runnable { public void run() { String name = Thread.currentThread().getName(); try { Thread.sleep(100);// 模拟任务执行的时间 System.out.println(name); } catch (InterruptedException e) { e.printStackTrace(); } } }