Java ExecutorService四种线程池使用详解

yizhihongxing

接下来我将详细讲解 "Java ExecutorService四种线程池使用详解" 的完整攻略,它包括了线程池的定义,四种线程池的使用以及线程池的实例化。

线程池的定义

在实际开发过程中,经常需要创建大量的线程来处理一些任务,这样一来就会使得系统开销增大,严重影响了系统的性能。线程池的出现就是为了解决这个问题。

线程池可以复用已创建的线程,降低线程的创建和销毁开销,同时能够提供对线程的统一调度、控制和监控等功能,从而更好的管理多线程程序。

Java ExecutorService四种线程池使用详解

在 Java 中,线程池使用 Java 自带的 ExecutorService 接口的实现类。ExecutorService 接口继承自 Executor 接口,是 ThreadPoolExecutor 和 ScheduledExecutorService 的超级接口,它定义了一些常用的管理线程的方法,比如提交任务、关闭线程池等,使用 ExecutorService 创建线程池可以大幅度提高线程的运行效率。接下来我们将详细讲解四种线程池的使用:

1. FixedThreadPool 线程池

FixedThreadPool 线程池是一种固定大小的线程池,线程数量由用户自行决定,并且线程池中创建的线程数量保持不变。如果有多余的任务需要执行,那么这些任务就会处于等待状态。适合执行长期的任务,性能稳定。

下面是一个示例代码:

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
    final int index = i;
    fixedThreadPool.execute(() -> {
        System.out.println("当前线程:" + Thread.currentThread().getName() + ",执行任务 index = " + index);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
}
fixedThreadPool.shutdown();

上面的代码中,我们创建了一个 FixedThreadPool 线程池,线程数量为 5,然后向线程池中提交了 10 个任务。由于线程池是固定大小的,所以实际只有前 5 个任务被立即执行,后面 5 个任务处于等待状态,当前 5 个任务执行完成后,后面 5 个任务开始执行。

2. CachedThreadPool 线程池

CachedThreadPool 线程池的线程数量是动态变化的,适用于执行时间比较短的任务,性能高效。如果当前线程池中有空闲的线程,则立即使用这些空闲的线程执行任务;如果没有空闲线程,则创建新的线程来执行任务,如果线程空闲时间超过 60 秒,则销毁线程。

下面是一个示例代码:

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
    final int index = i;
    cachedThreadPool.execute(() -> {
        System.out.println("当前线程:" + Thread.currentThread().getName() + ",执行任务 index = " + index);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
}
cachedThreadPool.shutdown();

上面的代码中,我们创建了一个 CachedThreadPool 线程池,然后向线程池中提交了 10 个任务。由于线程池的线程数量是动态变化的,所以实际上 10 个任务都会立即执行。

3. SingleThreadExecutor 线程池

SingleThreadExecutor 线程池是一种只有一个工作线程的线程池,适用于需要保证任务全部按照顺序执行的情况,可以避免多线程带来的访问冲突问题。

下面是一个示例代码:

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
    final int index = i;
    singleThreadExecutor.execute(() -> {
        System.out.println("当前线程:" + Thread.currentThread().getName() + ",执行任务 index = " + index);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
}
singleThreadExecutor.shutdown();

上面的代码中,我们创建了一个 SingleThreadExecutor 线程池,然后向线程池中提交了 10 个任务。由于线程池只有一个工作线程,所以这些任务会按照顺序依次执行。

4. ScheduledThreadPool 线程池

ScheduledThreadPool 线程池是一种可以定时执行任务的线程池,可以通过 schedule 方法来执行 Runnable 或 Callable 类型的任务,也可以使用 scheduleAtFixedRate 和 scheduleWithFixedDelay 方法来指定定时执行任务的时间间隔和延迟时间。

下面是一个示例代码:

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
scheduledThreadPool.schedule(() -> System.out.println("我将在 3 秒后被执行"), 3, TimeUnit.SECONDS);
scheduledThreadPool.schedule(new Callable<String>() {
    @Override
    public String call() {
        return "我将在 5 秒后被执行";
    }
}, 5, TimeUnit.SECONDS);
scheduledThreadPool.scheduleAtFixedRate(() -> {
    System.out.println("我将定时执行,每隔 1 秒就会被执行一次");
}, 0, 1, TimeUnit.SECONDS);
scheduledThreadPool.scheduleWithFixedDelay(() -> {
    System.out.println("我将延迟执行,每隔 2 秒就会被执行一次");
}, 0, 2, TimeUnit.SECONDS);

上面的代码中,我们创建了一个 ScheduledThreadPool 线程池,使用 schedule、scheduleAtFixedRate 和 scheduleWithFixedDelay 方法分别来指定任务的执行时间,时间间隔和延迟时间,可以轻松实现各种定时任务。

线程池的实例化

在 Java 中,可以使用 Executors 类的静态方法来创建线程池实例,这些静态方法都会返回 ExecutorService 接口对象,可以用来创建不同类型的线程池。

下面是一些常用的线程池实例化方法:

// 创建一个 FixedThreadPool 线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
// 创建一个 CachedThreadPool 线程池
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
// 创建一个 SingleThreadExecutor 线程池
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
// 创建一个 ScheduledThreadPool 线程池
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(10);

其中 newScheduledThreadPool 方法中的参数是表示线程池线程数量的,既可用于 FixedThreadPool,也可用于 ScheduledThreadPool。

以上就是 "Java ExecutorService四种线程池使用详解" 的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java ExecutorService四种线程池使用详解 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • feign post参数对象不加@RequestBody的使用说明

    关于“feign post参数对象不加@RequestBody的使用说明”,我将分以下几个方面进行详细讲解: @RequestBody注解的作用 不加@RequestBody的使用说明 示例说明 小结 1. @RequestBody注解的作用 首先,我们需要了解@RequestBody注解的作用。该注解用于将请求体中的参数绑定到方法参数上。即,使用该注解后,…

    Java 2023年5月23日
    00
  • springBoot2.X配置全局捕获异常的操作

    本文主要介绍如何使用 Spring Boot 2.x 配置全局的异常处理器。具体的步骤如下: 步骤一:新建异常处理器 首先,我们需要新建一个异常处理器类 GlobalExceptionHandler,该类需要实现 ErrorController 接口和 @RestControllerAdvice 注解。代码如下: @RestControllerAdvice …

    Java 2023年5月27日
    00
  • Java 实战项目之在线点餐系统的实现流程

    Java 实战项目之在线点餐系统的实现流程 在实现一个在线点餐系统时,需要考虑到多个方面的因素,涉及到技术栈、数据结构、算法等知识。本文将为大家详细讲解,如何实现一个完整的在线点餐系统。 目标 在线点餐系统需要实现的功能包括:用户注册、用户登录、浏览菜单、添加菜品到购物车、下订单、支付订单等。 实现步骤 步骤一:设计数据库 一个完整的系统,需先设计好数据库。…

    Java 2023年5月19日
    00
  • 图解Java经典算法归并排序的原理与实现

    图解Java经典算法归并排序的原理与实现 算法原理 归并排序是一种基于分治思想的排序算法,它将一个大的问题分解成若干个子问题,然后将子问题拆分到足够小的规模,最后对每个小问题进行解决,最终合并所有解决得到原始问题的解决方案。归并排序的执行过程可以简单地描述为两个步骤,分别为“分”和“治”。 分 归并排序的第一个步骤是分解,它将原始数组分解成若干个子数组,每个…

    Java 2023年5月19日
    00
  • Spring Security之默认的过滤器链及自定义Filter操作

    Spring Security 是 Spring 框架中提供的安全管理框架,它是基于 Servlet 过滤器实现的。 默认的过滤器链 Spring Security 在初始化时会自动生成一整套默认的过滤器链,这些过滤器链是按顺序有序地执行的。因为每个过滤器链都有特定的功能和处理逻辑,对于一个用户的请求,在整个过滤器链中会按照顺序经过每一个过滤器链的处理。最终…

    Java 2023年5月20日
    00
  • Java中switch的三种用法方式

    当我们在Java程序中需要根据不同的值来执行不同的操作时,我们可以使用switch语句。在Java中,switch语句有三种不同的用法方式:匹配一个具体的值、匹配一段范围、以及匹配一个枚举值。 匹配一个具体的值 当我们需要根据不同的值来执行不同的操作时,我们通常会使用switch语句的第一种用法方式:匹配一个具体的值。以下是一个示例: int num = 4…

    Java 2023年5月23日
    00
  • Nginx服务器中强制使用缓存的配置及缓存优先级的讲解

    针对“Nginx服务器中强制使用缓存的配置及缓存优先级的讲解”的问题,我可以提供以下的完整攻略: 强制使用缓存的配置 proxy_cache_bypass 在Nginx服务器中,可以通过设置proxy_cache_bypass配置来强制使用缓存。当需要绕过缓存向后端请求或满足某些条件时,可以通过在请求中设置特定的头部来绕过缓存,格式如下: proxy_cac…

    Java 2023年6月16日
    00
  • Eclipse最新版使用过程中遇到的问题总结

    Eclipse最新版使用过程中遇到的问题总结 作为一款强大的Java开发工具,Eclipse在开发中的使用率非常高。然而,在使用过程中可能会遇到一些问题,需要进行解决。本文总结了Eclipse最新版使用过程中可能遇到的问题及其解决方法,方便开发者在使用过程中进行参考。 问题一:Eclipse启动缓慢 在启动Eclipse时,会花费较长时间进行加载,影响开发效…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部