工作队列示例

在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
                }
            }
        }
    }
}

你可能感兴趣的:(thread,工作,IBM)