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

Threadpool如何重用线程及其工作原理

寿子默
2023-03-14

我的多线程概念很弱,正在努力学习。

在Java中,我所知道的是,我们不能多次调用线程:

Thread t = new Thread; //Some Runnable
t.start();

t.start(); //Illegal and throw Exception at runtime.

据我所知,当您再次调用t.start()时,它会引发异常,因为线程的关联堆栈一旦退出run()方法,并且您再次尝试初始化时就会被破坏。

在那种情况下,我对线程池的了解是,它给出了更好的性能&节省了时间,因为不需要创建新线程(我在这里读到)。

如果在线程池场景中不需要创建新的线程,那么它是如何与刚完成其run方法的同一线程一起工作的,该线程是否可以再次使用?

我读到了这篇文章,上面说“java.util.concurrent中的大多数执行器实现都使用线程池,线程池由工作线程组成,这种线程与它执行的可运行和可调用任务是分开存在的,经常用于执行多个任务。”

那么这里的工作线程是什么,它与普通Java线程有什么不同吗?

通过这个链接,我得到了一些东西,但仍然很困惑,当我们使用线程池时,什么样的东西可以被消除,以及为什么它比使用普通java线程提供更好的性能。

所以我们可以这样说吗,

  1. 创建(告诉OS它是新线程,为它创建堆栈。)
  2. 使用run()方法执行Runnable。
  3. 正在销毁线程。

因此,考虑到以上3个步骤,有了线程池,步骤1和步骤3可以在固定数量的线程创建后被取消。每个任务只执行步骤2,这就是threadpool更快的原因?我们能这样说吗?我说的对吗?

共有1个答案

姬雪松
2023-03-14

如果在ThreadPool场景中不需要创建新的线程,那么它是如何与刚完成其run方法的同一线程一起工作的,该线程是否可以再次使用?

简单-原来的线程从未真正完成。它只是等待另一个任务执行。在伪代码中:

// No, this isn't even slightly accurate! General impression only :)
while (!pool.isShutdown()) {
    Runnable task = pool.waitForTaskOnQueue();
    task.run();
}

(很明显,当线程池关闭时,它也需要停止等待线程来等待另一个任务--但希望您了解大致的想法。)

 类似资料:
  • 问题内容: 我的多线程概念薄弱,正在尝试学习。 在Java中,我所知道的是,我们不能多次调用一个线程: 据我所知,当您再次调用该函数时,它会引发异常,因为一旦线程退出方法,并且您试图再次初始化事物,该线程的关联堆栈就会被破坏。 在那种情况下,我对线程池的了解是,它提供了更好的性能并节省了时间,因为不需要创建新线程(我在此阅读)。 如果不需要在线程池中创建新线程,那么它如何与刚刚完成其run方法的同

  • 我知道如何禁用按钮,以防止它被点击两次。然而,如果我想再次启用它,只要它安全,我可以做类似的事情,我调用setenabled(true)在onclick??是一调用setenabled(false)就禁用按钮,还是只在onclick函数完成时禁用?

  • 在Vertx官方文件中,我阅读了以下段落 在关于Reactor的文章中: 据我所知,如果我写错了,请纠正我,Vertx的工作方式如下: 当我们为阻塞代码提供一个处理程序时,vertx将线程池中的一个线程(不是事件循环)放入该代码中,该线程等于内核数,例如我有4个内核,事件循环检查每次迭代后该线程的状态,如果它准备好执行与该阻塞代码相关的处理程序,当所有4个内核都忙时,vertx将任务放入队列,稍后

  • 问题内容: 我是一个初学者,在理解一段代码时遇到了麻烦。有人可以在这个功能启动时给我解释一下,它的作用是什么? 这是我的代码: 问题答案: 让我从一些背景知识开始(您可能已经了解了,但是需要进行解释)。 用于显示项目的长列表(或网格)。假设您要显示100行。一种简单的方法是只创建100个视图,每行一个视图,然后将它们全部布局。但这将是浪费的,因为它们中的大多数将不在屏幕上,因为可以说其中只有10个

  • 问题内容: 我们知道,主要的内存域很少:Young,Tenured(Old gen)和PermGen。 年轻领域分为伊甸园和幸存者(两个)。 OldGen用于保留对象。 MaxTenuringThreshold可以防止将对象最终过早地复制到OldGen空间。这很清楚而且可以理解。 但是它如何工作?垃圾收集器如何处理这些仍存活到MaxTenuringThreshold的对象,并且以什么方式处理?他们

  • 我试图理解fork-join的窃取部分。fork-join池具有具有自己Deque的工作线程。如果工作线程自身的deque为空,则该线程从另一个工作线程中窃取。 线程如何访问其他线程的状态? 当所有者线程和窃取者线程尝试访问取消排队中的同一项目时,它不会产生同步问题吗?