java - Threadpool 如何重用线程以及它是如何工作的

标签 java multithreading concurrency threadpool

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

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

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

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

据我所知,当你再次调用 t.start() 时它会抛出异常,因为线程的关联堆栈一旦退出 run() 就会被销毁code> 方法,你正在尝试再次初始化。

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

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

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

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

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

所以我们可以这样说,

线程分为三个部分,

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

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

最佳答案

If there is no need to create new Thread in ThreadPool scenario, then how it works with same thread which just finished its run method, will that Thread can be used again?

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

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

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

关于java - Threadpool 如何重用线程以及它是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19765904/

相关文章:

java - SpringMVC获取404错误

c# - 如何在遵循 MVVM 设计模式的 WPF 应用程序中工作之前显示等待对话框?

.net - 使用 .Net 4 & Concurrent Collections 缓存超时

multithreading - Scala Future vs Thread 用于长时间运行的任务而没有结果

java - 带有 $in 运算符的 mongodb find() 是顺序的还是并行的?

java - 如何对列表使用递归方法

java - 尝试在 JavaFX 中创建一个 "Ball"类,该类由一个可通过按钮控制的圆圈组成,可在屏幕上向左、向右、向上和向下移动

java - Spring @Around 用于异常处理

multithreading - 线程 perl 中未锁定的共享哈希操作安全性

java - 在 Java 中关闭 ExecutorService 的最佳方法