在Java ThreadPool上感到困惑

在我遇到这个链接之后,这是我第一次使用Java Thread Pool进行我的新项目http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using-executors-and-threadpoolexecutor .html ,我对此更加困惑,这里是来自页面的代码,

package com.journaldev.threadpool; public class WorkerThread implements Runnable { private String command; public WorkerThread(String s){ this.command=s; } @Override public void run() { System.out.println(Thread.currentThread().getName()+' Start. Command = '+command); processCommand(); System.out.println(Thread.currentThread().getName()+' End.'); } private void processCommand() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public String toString(){ return this.command; } } package com.journaldev.threadpool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SimpleThreadPool { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(5); for (int i = 0; i < 10; i++) { Runnable worker = new WorkerThread('' + i); executor.execute(worker); } executor.shutdown(); while (!executor.isTerminated()) { } System.out.println('Finished all threads'); } } 

在代码中,创建了一个固定大小的池,并创建了10个工作线程,对吗?

线程池应该减轻系统的负担,相反,在上面的代码中,我认为除了工作线程之外还通过创建池来增加负担。 为什么懒得使用线程池?

谁有人解释一下? 谢谢

我也在StackOverflow上阅读了这篇文章http://stackoverflow.com/questions/19765904/how-threadpool-re-use-threads-and-how-it-works它也没有帮助我。

这很令人困惑,因为Runnables名为WorkerThread,但它们不扩展java.lang.Thread,它们只是实现Runnable的对象。 实现Runnable允许您指定需要执行的任务,而无需实例化实际的Thread对象。 在您的示例中创建的唯一线程是主线程和Executor创建的线程。

请注意,即使您更改此代码以使WorkerThread扩展Thread,只要代码不对它们调用start,它就不会导致更multithreading实际运行。 构造一个线程对象涉及一些事情,比如检查安全管理器和初始化threadlocals,但它实际上并没有在操作系统级别做任何事情来分配线程。 就Executor而言,它们只是Runnables,它将使用线程池的线程执行它们。

不好的例子! 名为WorkerThread的类不是线程,它是一个“任务”。

线程隐藏在ExecutorService中。 该示例创建一个具有五个“工作”线程的ExecutorService,它创建十个任务,它要求执行程序服务“执行”它们,最后,它等待所有任务完成。 完全由ExecutorService决定如何以及何时以及在哪个工作线程中执行每个任务。

该示例的另一个较小问题是主线程在请求​​执行程序服务关闭后如何等待。 它使用可能已被一个或多个工作程序使用的CPU资源旋转(取决于主机可用于运行各种线程的CPU数量。)等待循环应调用Thread.yield(),它放弃了每次调用主线程的时间片到任何其他可运行线程的时间片。