首页  >  文章  >  Java  >  Java线程池

Java线程池

PHPz
PHPz原创
2024-08-30 16:03:21905浏览

线程池,顾名思义,就是可以重用的线程的集合。这些线程之前已创建,并且当已经存在可用线程集合时,还可以提供开销解决方案;这些可以重用并解决线程循环和等待线程完成其任务的问题。由于每当请求到达时线程就已经存在,因此它将消除线程创建的过程,从而节省时间并使处理速度更快。在本主题中,我们将学习 Java 线程池。

开始您的免费软件开发课程

网络开发、编程语言、软件测试及其他

Java 线程池的工作

线程池中的所有线程都实现 java.util.concurrent 中的方法。有一个线程池,由Java线程池管理。查看此池的最简单方法是使用的线程越多,每个线程执行实际工作所花费的时间就越少。这是一种有助于在可以使用多线程的应用程序中节省资源的方法。该 Java 线程为池维护一个队列。

工作线程一直等待分配任务并执行它们。 Java中使用ThreadPoolExecutor来创建线程池。可运行线程的集合负责管理Java线程池中的线程。此后,工作线程出现并形成队列。线程池监控这些队列。

java.util.concurrent.Executors 帮助我们管理线程所需的工厂和支持方法。该类还负责创建线程池。现在您的下一个问题可能是,这个执行者是什么? Executor 提供了不同的类,它们是实用程序类的一部分。

线程池的技术工作可以被认为是一个拥有并发代码的池,它被分成可以并行运行的任务。然后它们被提交到池中执行。有任务提交者、执行者服务、任务队列,最后还有线程池。该模式可以帮助您控制应用程序中存在的线程数。它决定其生命周期,安排任务,并将传入的任务保留在工作队列中。

Executorshelper 类具有各种具有预配置线程池实例的方法。 Executor 和 ExecutorService 接口有助于处理池中的不同实现。在实际实现之前,代码必须是解耦的格式。还有一个使用的接口。它是一个ThreadPoolExecutor。它是一个可扩展的线程池实现,可以指定许多参数,并且可以进行微调。可以使用的参数包括核心池大小、最大池大小和保活时间。队列只能增长到最大池大小。

Java 线程池示例

让我们创建一个池并看看它是如何工作的。

代码:

import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// The Job class will be executed in this case
class Job implements Runnable
{
private String name;
public Job(String s)
{
name = s;
}
// The task name will be populated first for the ones which were not running already, and the thread will sleep for 2s
//This entire method will be repeated 6 times
public void run()
{
try
{
for (int i = 0; i<=5; i++)
{
if (i==0)
{
Date d = new Date();
System.out.println("We are in "
+ " task name - "+ name);
//prints the task name every time the new task is started
}
else
{
System.out.println("The job "+
name +" is already running ");
// prints the job name which is already running
}
Thread.sleep(2000); // The thread is in sleep mode for 2 secs
}
System.out.println(name+" job is completes");
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
public class Test
{
// Here we define the maximum threads we have
static final int MAX_Threads= 5;
public static void main(String[] args)
{
Runnable run1 = new Job("task 1");
Runnable run2 = new Job("task 2");
Runnable run3 = new Job("task 3");
//A new thread pool is created with maximum number of threads
ExecutorService newpool = Executors.newFixedThreadPool(MAX_Threads);
newpool.execute(run1);
newpool.execute(run2);
newpool.execute(run3);
newpool.shutdown();
}
}

上面的代码涵盖了线程创建直到关闭的每个步骤。固定和创建的最大线程限制。完成此操作后,将创建三个作业并一一执行。每个作业还分配有 2 秒的睡眠时间。由于线程池已创建并且所有作业同时工作,我们可以看到整个过程将运行 6 次。当 if 语句在线程池中运行时,它会检查作业是否已经在运行。如果作业尚未开始运行,它将执行 if 块。如果它已经在运行,那么 else 块将被运行。它将显示作业名称并表示它已经在运行。创建线程池,然后运行所有 3 个作业。作业运行后,我们关闭创建的线程池。

下面是给定程序的输出。

输出:

Java线程池

它会运行直到所有任务完成。

线程池的优点和缺点

Java 中的线程池有几个优点。仅举几例,以下是主要优点:

  • 它可以提高 CPU 和程序的性能。
  • 由于不同的线程正在处理所有进程,因此节省了时间。
  • 线程池的主要优点是重用已经存在的线程。无需一次又一次创建新线程。
  • 它提供实时访问,这有助于处理实时数据。

不过,线程池也有一些缺点。以下是缺点:

  • 您无法设置任务的优先级,并且无法跟踪这些任务。
  • 使用多了,可以自动删除。

结论

因此,线程池是处理我们手头的多个任务的有效方法。 Java 为我们提供了重用线程和利用现有资源的便利。

以上是Java线程池的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn