Java中线程池的用途是什么?

时间:2010-07-20 02:45:11

标签: java multithreading threadpool

线程池有什么用?有一个很好的现实世界的例子吗?

7 个答案:

答案 0 :(得分:42)

线程池是最初创建的一组线程,它们等待作业并执行它们。我们的想法是让线程始终存在,这样我们就不必每次都花费很多时间来创建它们。当我们知道要处理的工作流时,它们是合适的,即使可能有一段时间没有工作。

以下是来自Wikipedia的精美图表: alt text

答案 1 :(得分:7)

来自Java Tutorials的

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?