package com.rapidftr.net; import com.sun.me.web.request.Request; public class RequestPool implements Runnable { // a simple implementation of singleton private static RequestPool _instance = new RequestPool(); static final int MAXIMUM_ACTIVE_THREADS = 5; int activeThreads = 0; private WorkQueue requestQueue; private RequestExecutor requestExecutor; public RequestPool() { requestQueue = new WorkQueue(); new Thread(this).start(); } public static RequestPool getInstance(HttpGateway httpGateway) { _instance.requestExecutor = new RequestExecutor(httpGateway); return _instance; } public void execute(Request request) { synchronized (requestQueue) { requestQueue.addRequest(new WorkerThread(request)); requestQueue.notify(); } } public void run() { while (true) { if (!requestQueue.isEmpty() && activeThreads < MAXIMUM_ACTIVE_THREADS) { activeThreads++; requestQueue.spawnNextRequestThread(); } else { if (requestQueue.isEmpty()) { synchronized (requestQueue) { try { requestQueue.wait(); } catch (InterruptedException ignored) { } } } } } } public synchronized void decrementActiveThreadCount() { activeThreads--; synchronized (requestQueue) { requestQueue.notify(); } } public void cancelAllRequests() { requestQueue.cancelAllRequests(); } private class WorkerThread implements Runnable { Request request; public WorkerThread(Request request) { super(); this.request = request; } public void run() { try { requestExecutor.execute(request); } finally { decrementActiveThreadCount(); } } } }