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

Jav*_*ser 36 java multithreading threadpool

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

Ami*_*hum 47

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

这是维基百科的一个很好的图表: 替代文字

  • 我们可以估计线程池所需的线程数吗?还是每个线程池都有线程限制? (2认同)

Jus*_*ier 7

Java教程中的线程池有一个很好的概述:

使用工作线程可以最大限度地减少由于创建线程而产生 线程对象使用大量内存,而在大型应用程序中,分配和释放许多线程对象会产生大量的内存管理开销.


S73*_*17H 5

通过简单的Google搜索,可以获得有关Java线程池和线程池的大量信息.

以下是一些有用的链接:


小智 5

线程池仅在服务器 - 客户端类型的情况下有用,其中无法确定/预测客户端请求的数量/发生.

在这种情况下,每次发出客户端请求时创建一个新线程有两个不利之处:

1)线程创建的运行时间延迟:创建线程需要一些时间,因此实际作业不会在请求进入后立即启动.客户端可能会注意到一点延迟.

此标准在交互式系统中至关重要,客户希望立即采取行动.

2)系统资源的不受控制的使用:线程消耗系统资源(存储器等),因此在存在前所未有的客户端请求流的情况下,系统可能耗尽资源.

线程池通过以下方式解决上述问题:
1)在服务器启动时创建指定数量的线程,而不是在运行时创建它们.
2)限制在任何给定时间运行的线程数.

注意:以上内容适用于固定大小的线程池.


roo*_*ler 5

线程池是已经创建好的工作线程池。它创建Thread和管理它们。线程池不是以创建线程并在完成任务后将其丢弃的方式,而是以工作线程的形式重用线程。

为什么?

由于创建线程是耗时的过程,因此会延迟请求处理。它还根据每个JVM允许的线程数限制客户端的数量,这显然是有限的。


使用Executor框架创建固定大小的线程池-

Java 5引入了全功能的内置线程池框架,通常称为Executor框架

Executor由于Executors类提供了静态工厂方法,因此使用Java 5 框架创建固定大小的线程池非常容易。您需要做的就是定义要同时执行的任务,然后将该任务提交给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
Run Code Online (Sandbox Code Playgroud)