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();
答案 0 :(得分:2)
Runnable
不是正在运行的线程。对于这个问题,Callable
和Thread
都不是。
只有当.start()
Thread
.run()
Runnable
或.call()
一个{{1}时,才会在JVM级别创建一个线程});在那之前,它们只是正常的常规物体。
当您使用Callable
时,它是执行者,它将管理您的Executor
或Runnable
并启动“真实”线程。
答案 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
这一事实感到困惑。事实上,这实际上意味着Thread
是Runnable
,而不是Runnable
是Thread
- 而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个线程。