在IBM网站查到相关示例,稍作调整,记下来备用
/** * 工作队列 */public class WorkQueue { private final PoolWorker[] threads; private final LinkedList<Runnable> queue; private static WorkQueue instance = null; /** * 构造工作队列并指定工作队列大小 * @param nThreads * @return */ public static WorkQueue newInstance(int nThreads) { if(instance == null) { synchronized(WorkQueue.class) { if(instance == null) { instance = new WorkQueue(nThreads); } } } return instance; } /** * 获得工作队列示例 使用默认大小5 * @return */ public static WorkQueue getInstance() { if(instance == null) { synchronized(WorkQueue.class) { if(instance == null) { // default set work queue size to 5 instance = new WorkQueue(5); } } } return instance; } /** * 私有构造函数 * @param nThreads */ private WorkQueue(int nThreads) { queue = new LinkedList<Runnable>(); threads = new PoolWorker[nThreads]; for (int i = 0; i < nThreads; i++) { threads[i] = new PoolWorker(); threads[i].start(); } } /** * 工作队列中放入执行任务并通知执行线程执行 * @param r */ public void execute(Runnable r) { synchronized (queue) { queue.addLast(r); queue.notify(); } } /** * 执行线程 */ private class PoolWorker extends Thread { public void run() { Runnable r; while (true) { synchronized (queue) { while (queue.isEmpty()) { try { queue.wait(); } catch (InterruptedException ignored) { } } r = (Runnable) queue.removeFirst(); } // If we don't catch RuntimeException, // the pool could leak threads try { r.run(); } catch (RuntimeException e) { // You might want to log something here } } } }}