class DownloadThreadPool {

    private static final Logger logger = Logger.getLogger(DownloadThreadPool.class);
    private ThreadPoolExecutor threadPool = null;

    public DownloadThreadPool() {
        initialize("Main");
    }

    public DownloadThreadPool(String threadPoolName) {
        initialize(threadPoolName);
    }
    
    /**
     * Initializes the threadpool.
     * @param threadPoolName Name of the threadpool.
     */
    private void initialize(String threadPoolName) {<FILL_FUNCTION_BODY>}
    /**
     * For adding threads to execution pool.
     * @param t 
     *      Thread to be added.
     */
    public void addThread(Thread t) {
        threadPool.execute(t);
    }

    /**
     * Tries to shutdown threadpool.
     */
    public void waitForThreads() {
        threadPool.shutdown();
        try {
            threadPool.awaitTermination(3600, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            logger.error("[!] Interrupted while waiting for threads to finish: ", e);
        }
    }
}

        int threads = Utils.getConfigInteger("threads.size", 10);
        logger.debug("Initializing " + threadPoolName + " thread pool with " + threads + " threads");
        threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(threads);
    
<no_super_class>