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

我的多线程概念很弱,并且试图学习。

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

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

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

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

在这种情况下,我对线程池的了解是,它提供了更好的性能并节省了时间,因为不需要创建新线程(我在本文中阅读)。

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

我读了这篇文章,它说“java.util.concurrent 中的大多数执行器实现都使用线程池,它由工作线程组成。这种线程与它执行的 Runnable 和 Callable 任务分开存在,通常用于执行多个任务。"

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

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

所以我们可以这样说,

螺纹有三个部分,

  1. 创建(告诉操作系统它是新线程,为其创建堆栈。
  2. 使用 run() 方法执行 Runnable。
  3. 破坏线程。

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


答案 1

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

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

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

(显然,当线程池关闭时,它也需要停止等待线程等待另一个任务 - 但希望你得到一般的想法。


答案 2

该过程分为两部分:

提交任务:线程池与阻塞队列紧密耦合。当我们说experator.execute(runnable)时。可运行/可调用在队列中排队。

执行任务:现在需要从队列中选取任务。假设每当在队列中提交任务时,都必须选取并执行该任务。

因此,有些线程将运行无限循环并监视任务队列。一旦任务可用,一个线程将选择它并执行。


推荐