在这段代码中创建了多少个线程?

时间:2014-03-17 19:49:57

标签: java multithreading

Executors.newFixedThreadPool(5)在池中创建5个线程,然后在循环中创建另外100个线程。这种理解对吗?然后池中的5个线程将​​执行100个工作线程队列中的每个线程。

总共创建了105个线程?我原以为只创建了5个线程,但每个Runnable也是一个线程。

ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 100; i++) {
    Runnable worker = new WorkerThread("" + i);
    executor.execute(worker);
}
executor.shutdown();

5 个答案:

答案 0 :(得分:2)

Runnable不是正在运行的线程。对于这个问题,CallableThread都不是。

只有当.start() Thread .run() Runnable.call()一个{{1}时,才会在JVM级别创建一个线程});在那之前,它们只是正常的常规物体。

当您使用Callable时,它是执行者,它将管理您的ExecutorRunnable并启动“真实”线程。

答案 1 :(得分:2)

  

Executors.newFixedThreadPool(5)在池中创建5个线程,然后在循环中创建另外100个线程。这种理解对吗?然后池中的5个线程将​​执行100个工作线程队列中的每个线程。

这不正确。固定大小的线程池执行程序将创建5个工作线程。您的100 Runnable都被添加到这5个线程正在拉出的队列中。因此,在任何给定时间,只有5个Runnable正在执行。有5个线程(加上主线程,如果你使用Swing,可能还有EDT,当然还有你明确创建的任何其他无关线程)。

  

我原以为只创建了5个线程,但每个Runnable也是一个线程。

Runnable不是线程。顾名思义,Runnable只是可以运行的东西。对于固定大小的线程池,它由池中的一个线程运行。从Runnable的文档(强调我的):

  

Runnable接口应该由任何类实现,其实例是通过一个线程执行的。

我相信你的困惑的根源可能是你的Runnable被命名为WorkerThread,即使它们不是线程。此外,您可能会对Thread 实现 Runnable这一事实感到困惑。事实上,这实际上意味着ThreadRunnable,而不是RunnableThread - 而Thread甚至不是直到它开始为止。

答案 2 :(得分:1)

不要将Thread类与线程混淆。 Java使用Thread类来生成线程,但它不一定是1对1映射。

在您的代码中,您的WorkerThread类似乎是Thread的子类。但是,Thread也会实现Runnable,这就是您的ExecutorService正在使用它的方式。它只是在它启动的5个线程中的一个中调用其run()方法

  

在此代码中创建了多少个线程?

ExecutorService启动的所有主题。

答案 3 :(得分:0)

与任何其他interface一样,Runnable只是interface。另外Thread只是一个类而不是一个单独的线程。在Thread类上调用start()方法之前,不会创建实际线程。

答案 4 :(得分:0)

“池中的线程数将被修复。如果请求超过线程数,它们将在队列中等待。如果线程死亡或终止,将创建一个新线程。” More here

在这种情况下,只存在最多5个线程。