如果由于创建的线程数而出现延迟,最好的解决方案可能是减少创建的线程数。
此外,Java 5 引入了执行器服务框架,在 Java 7 中通过 fork/joins 再次对其进行了改进,因此在正常情况下您根本不必自己创建线程。(这里是一个页面链接,对这些概念有很好的解释。)
我通常不会启动比机器上的内核更多的线程,如下所示:
int availableThreads = Runtime.getRuntime().availableProcessors();
ExecutorService executorService = Executors.newFixedThreadPool(availableThreads);
// ...Create List<Future<ReturnObject>>
// populate list by calling futures.add(executorService.submit(callable));
executorService.shutdown();
这是因为,只要是计算密集型进程,当您在每个内核上同时进行计算而不是在单个内核上进行线程切换时,您就可以获得最大的线程增益。当然,当您谈论磁盘或网络密集型进程时,情况会发生变化,但这是一个非常好的经验法则。