线程池有什么用?有一个很好的现实世界的例子吗?
答案 0 :(得分:42)
线程池是最初创建的一组线程,它们等待作业并执行它们。我们的想法是让线程始终存在,这样我们就不必每次都花费很多时间来创建它们。当我们知道要处理的工作流时,它们是合适的,即使可能有一段时间没有工作。
以下是来自Wikipedia的精美图表:
答案 1 :(得分:7)
Thread Pools有一个很好的概述:
使用工作线程可以最大限度地减少因创建线程而产生的开销。线程对象使用大量内存,在大型应用程序中,分配和释放许多线程对象会产生大量的内存管理开销。
答案 2 :(得分:5)
简单的Google搜索通常会产生大量有关Java线程池和线程池的信息。
以下是一些有用的链接:
答案 3 :(得分:5)
线程池仅在服务器客户端类型的情况下有用,在这种情况下无法确定/预测客户端请求的数量/发生。
在这种情况下,每次发出客户端请求时创建一个新线程都有两个不利之处:
1)线程创建的运行时间延迟: 创建一个线程需要一些时间,因此实际工作不会在请求进入后立即开始。客户可能会注意到一点延迟。
此标准在交互式系统中至关重要,客户希望立即采取行动。
2)不受控制地使用系统资源: 线程消耗系统资源(内存等),因此如果有前所未有的客户端请求流,系统可能会耗尽资源。
线程池通过以下方式解决上述问题:
1)在服务器启动时创建指定数量的线程,而不是在运行时创建它们
2)限制在任何给定时间运行的线程数。
注意:以上内容适用于固定大小的线程池。
答案 4 :(得分:4)
您可以将线程视为实际工作者,将线程池视为工作组。 您可以出于各种原因创建多个组,例如优先级,目的等。 因此,虽然一个池可以用于诸如后台计划,电子邮件广播等通用任务,但是可能存在事务处理池以同时处理多个事务。对于Executor服务,我确信您不希望在其他非关键活动(如广播确认电子邮件或数据库维护活动)未完成之后延迟完成事务作业。 您可以将它们分隔成池并独立维护它们。 这是一个非常简单的答案,而不涉及技术术语。 问候, KT
答案 5 :(得分:3)
线程池是已准备好的工作线程池,可以完成这项工作。它创建Thread
并管理它们。完成任务后,线程池不再创建线程并丢弃它们,而是以工作线程的形式重用线程。
<强>为什么吗
因为创建Thread是一个耗时的过程并且它会延迟请求处理。它还根据每个JVM允许的线程数来限制客户端数量,这显然是有限的数量。
使用Executor框架创建固定大小的线程池 -
Java 5引入了一个完整的内置线程池框架,通常称为 Executor framework 。
使用Java 5 Executor
框架创建固定大小的线程池非常简单,因为Executors
类提供了静态工厂方法。您需要做的就是定义要同时执行的任务,而不是将该任务提交到ExecutorService
。
从这里开始,线程池将负责如何执行该任务;它可以由任何自由工作线程执行。
public class ThreadPoolExample {
public static void main(String args[]) {
ExecutorService service = Executors.newFixedThreadPool(10); //create 10 worker threads in Thread Pool
for (int i =0; i<100; i++){
service.submit(new Task(i)); //submit that to be done
}
}
}
final class Task implements Runnable {
private int taskId;
public Task(int id){
this.taskId = id;
}
@Override
public void run() {
System.out.println("Task ID : " + this.taskId +" performed by "
+ Thread.currentThread().getName());
}
}
Output:
Task ID : 0 performed by pool-1-thread-1
Task ID : 3 performed by pool-1-thread-4
Task ID : 2 performed by pool-1-thread-3
Task ID : 1 performed by pool-1-thread-2
Task ID : 5 performed by pool-1-thread-6
Task ID : 4 performed by pool-1-thread-5
*Output may vary from system to system
答案 6 :(得分:1)
已经有很好的答案来解释它,但让我们理解它 举个例子:
没有线程池的问题:考虑一个Web服务器应用程序,其中每个HTTP请求均由单独的线程处理。如果应用程序只是为每个新的HTTP请求创建一个新线程,并且系统收到的请求超出了立即处理的请求,则当所有这些线程的开销超出系统容量时,应用程序将突然停止响应所有请求。 / p>
线程池解决方案:由于可以创建的线程数受到限制,因此应用程序将不会尽快处理HTTP请求,但会为它们提供服务系统可以维持的最快速度。
有关更多详细信息(所有线程的开销):Why is creating a Thread said to be expensive?