当前位置: 首页 > 知识库问答 >
问题:

这段代码创建了多少线程?[复制]

习宸
2023-03-14

执行者。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();

共有3个答案

易宣
2023-03-14

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

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

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

由执行器服务启动的所有线程。

程项禹
2023-03-14

Runnable不是正在运行的线程。无论是可调用的还是线程

只有在时,才会在JVM级别创建线程。start()a线程(它将.run()aRunnable)。call()aCallable);在那之前,它们只是普通的普通物体。

当你使用执行器时,它将管理你的可运行的可调用的并在可以的时候启动“真正的”线程。

殷永嘉
2023-03-14

遗嘱执行人。newFixedThreadPool(5)在池中创建5个线程,然后在循环中再创建100个线程。这种理解正确吗?然后池中的5个线程将执行100个工作线程队列中的每个线程。

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

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

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

Runnable接口应该由其实例将由线程执行的任何类实现。

我相信您混淆的根源可能是您的Runnables被不恰当地命名为WorkerThread,即使它们不是线程。此外,您可能会被Thread也实现了Runnable这一事实所困惑。事实上,这字面意思是ThreadRunnable,而不是RunnableThread-Thread甚至不是线程直到它开始。

 类似资料:
  • 由于std::sort的时间复杂度为nlog(n),我们有(N1+N2....Nk)次迭代,因此我假设总的时间复杂度为O((N1+N2....+Nk)klog(k))。但是在每次迭代中,vector的大小可能会有所不同,所以我有点困惑。有人能证实这一点吗? 2.我还在leetcode论坛上看到了另一个使用“合并排序”思想的解决方案。它每次都合并两个链表。 我想知道这个解决方案的时间复杂度是多少?因

  • 如果我把 nums 设置为 10000,那么每次都准确输出 20000。或者设置的值比 10000 要少时也能准确输出。如果我把 nums 设置为 100000,那么每次输出的值都好像是随机的,范围在 100000 到 200000 之间。 如果是因为线程之间执行顺序的问题导致输出不确定,那为什么当值为 10000 时输出的值是比较确定的?

  • 可能重复: pthread\u创建的线程是否与内核线程相同? 我使用下面的代码来测试pthread_create函数可以创建的最大线程数。 输出是: 这是pthread_create函数可以创建的最大线程数吗? 此外,我使用以下命令查看系统允许的最大线程数: 号码是772432。 为什么我的程序的输出不等于的值? 我的操作系统是Fodaro 16,12核,48G RAM。

  • 所以我不确定是0还是2。 如果有人知道请告诉我。

  • 如果我们使用 那么创建了多少对象,它们驻留在哪里?

  • 给出的代码打印1 0 12然后显示分段错误,尝试了很长时间来解决这个问题,但没有发现错误,请帮助:我没有看到分段错误的原因,一直在尝试用链表实现队列,尝试使用不同的编译器,但没有帮助。在给定的代码中,如果可能的话,请找出错误,并告诉我如何改进这段代码