通过简单的Google搜索,可以获得有关Java线程池和线程池的大量信息.
以下是一些有用的链接:
小智 5
线程池仅在服务器 - 客户端类型的情况下有用,其中无法确定/预测客户端请求的数量/发生.
在这种情况下,每次发出客户端请求时创建一个新线程有两个不利之处:
1)线程创建的运行时间延迟:创建线程需要一些时间,因此实际作业不会在请求进入后立即启动.客户端可能会注意到一点延迟.
此标准在交互式系统中至关重要,客户希望立即采取行动.
2)系统资源的不受控制的使用:线程消耗系统资源(存储器等),因此在存在前所未有的客户端请求流的情况下,系统可能耗尽资源.
线程池通过以下方式解决上述问题:
1)在服务器启动时创建指定数量的线程,而不是在运行时创建它们.
2)限制在任何给定时间运行的线程数.
注意:以上内容适用于固定大小的线程池.
线程池是已经创建好的工作线程池。它创建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)