そいえばJava 7からはFork/JoinフレームワークのためにForkJoinPoolというExcecutorServiceに加わった(何故かExcecutorsには生成メソッドが無いけど)。
試しにHTTPのダウンローダ

ExecutorService executor = Executors.newCachedThreadPool();

ExecutorService executor = new ForkJoinPool();

と書き変えるとそのまま動く。
どうも引数指定しないとスレッド数がコア数になるっぽいので

ExecutorService executor = new ForkJoinPool(HTTPコネクションパス数+1);

にする。
うむ、スピードは全然変わらん。まぁHTTPが速度の決め手だし。殆どコネクションプールの空き待ちだろう。
生成スレッド数

ManagementFactory.getThreadMXBean().getPeakThreadCount();

がnewCachedThreadPool()だと360個、ForkJoinPool()だと9個。初期値から一切増えないあたりどっちかというとnewFixedThreadPool()っぽいな。
新しい分だけ何かしらForkJoinPoolの方がタスクの受け渡し等々効率が良いのではなかろうかと思うんだけど、何せ通信が入っているので微妙な差は消えてしまったり。