java中Executor,ExecutorService,ThreadPoolExecutor详解

Java中的Executor框架提供了一组API,可用于优雅地管理多线程、线程池和异步调用。主要由三个接口组成:Executor、ExecutorService和ThreadPoolExecutor。

Executor接口

Executor是一个简单的接口,它提供了一种方法将任务提交到线程中执行。 其定义如下:

public interface Executor {
    void execute(Runnable command);
}

该接口只包含一个方法execute,该方法使用Runnable对象表示需要执行的任务并将其提交到线程中。

ExecutorService接口

ExecutorService接口继承自Executor接口,提供了更多的方法,如可以提交一个Callable对象和在一定时间内获取一个Future对象等,其定义如下:

public interface ExecutorService extends Executor {
    <T> Future<T> submit(Callable<T> task);
    <T> Future<T> submit(Runnable task, T result);
    Future<?> submit(Runnable task);
    //其他方法...
}

其中,submit方法可以用来提交任务,submit(Runnable task, T result)方法还可以获取任务执行结果,submit(Callable task)方法则可以返回一个Future表示异步任务的执行状态。

例子1:使用ExecutorService提交任务

ExecutorService executorService = Executors.newCachedThreadPool(); // 创建线程池
executorService.submit(new Runnable() {
    @Override
    public void run() {
        // 执行任务
    }
});

例子2:使用submit(Callable task)返回Future对象

ExecutorService executorService = Executors.newFixedThreadPool(5); // 创建线程池
Future<String> future = executorService.submit(new Callable<String>() {
    @Override
    public String call() throws Exception {
        // 执行任务
        return "task done";
    }
});
String result = future.get(); // 获取任务结果
System.out.println(result); // 输出 "task done"

ThreadPoolExecutor类

ThreadPoolExecutor 类是 ExecutorService 的默认实现,提供灵活的线程池管理。这个类提供了以下构造器:

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, 
                           BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

参数解释:

  • corePoolSize:线程池中的核心线程数。
  • maximumPoolSize:线程池中的最大线程数。
  • keepAliveTime:非核心线程空闲时间,超过这个时间,线程就会被回收。
  • unit:keepAliveTime 的时间单位。
  • workQueue:用于保存等待执行的任务的阻塞队列。
  • threadFactory:创建新线程的工厂类。
  • handler:拒绝策略。

例子3:创建一个FixedThreadPool

ExecutorService executorService = Executors.newFixedThreadPool(5);  //等价于 ThreadPoolExecutor(5,5,0L,TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())

例子4:自己配置ThreadPoolExecutor

ThreadPoolExecutor executor = new ThreadPoolExecutor(4, 10, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(20));
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.prestartAllCoreThreads();

以上为Executor,ExecutorService,ThreadPoolExecutor等Java多线程中的重要数据类型之介绍.通过对这三种数据类型多线程管理器的了解可在实际项目中很好的规划多线程而有效的解决多线程问题。

阅读剩余 45%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java中Executor,ExecutorService,ThreadPoolExecutor详解 - Python技术站

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

相关文章

  • Java线程代码的实现方法

    下面是详细讲解“Java线程代码的实现方法”的完整攻略。 一、Java线程实现方法 Java中实现线程的方法主要有两种:继承Thread类和实现Runnable接口。两种方法各有优缺点,以下分别进行介绍。 1. 继承Thread类 继承Thread类是实现Java线程的较为简单的方法。继承Thread类后重写run()方法,将run()方法中需要线程执行的代…

    Java 2023年5月18日
    00
  • JavaScript数据类型和变量_动力节点Java学院整理

    JavaScript数据类型和变量攻略 JavaScript数据类型 JavaScript有七种数据类型:数字(Number)、字符串(String)、布尔(Boolean)、对象(Object)、空(Null)、未定义(Undefined)和Symbol(符号) 使用typeof操作符可以检测数据类型 // 检测数字类型 typeof 123 //输出 &…

    Java 2023年5月26日
    00
  • Java中的死锁是什么?

    Java中的死锁是指两个或多个线程在等待对方释放资源时无限期地阻塞的状态,而无法继续执行。这种情况出现在多个线程互相持有对方所需要的锁时,彼此都无法继续执行,就会形成死锁。 以下是两个简单的示例: 示例一: public class DeadlockExample { private static final String resource1 = &quot…

    Java 2023年4月27日
    00
  • SpringMVC 拦截器的使用示例

    以下是关于“SpringMVC 拦截器的使用示例”的完整攻略,其中包含两个示例。 SpringMVC 拦截器的使用示例 SpringMVC是一个基于Java的Web框架,它可以帮助我们快速开发Web应用程序。拦截器是SpringMVC中的一个组件,它可以帮助我们在请求到达Controller之前或之后执行一些操作。本文将介绍如何使用SpringMVC拦截器。…

    Java 2023年5月17日
    00
  • 响应式编程初探

    响应式 响应式系统(Reactive System) 具有以下特质:即时响应性(Responsive)、回弹性(Resilient)、弹性(Elastic)以及消息驱动(Message Driven)响应式系统更加灵活,松耦合,可伸缩 即时响应性 只要有可能, 系统就会及时地做出响应。 即时响应是可用性和实用性的基石, 而更加重要的是,即时响应意味着可以快速…

    Java 2023年4月17日
    00
  • Java 注解学习笔记

    下面我来为您详细讲解“Java 注解学习笔记”的完整攻略。 什么是Java注解? Java注解(Annotation),也叫元数据(metadata),为我们在代码中添加信息提供了一种形式化的方法,使我们可以在运行时和编译时进行代码分析。它可以用于向编译器、虚拟机和其他工具提供元数据。 Java注解使用@注解名的方式表达,例如@Override是Java内置…

    Java 2023年5月26日
    00
  • spring security与corsFilter冲突的解决方案

    对于Spring Security和CORS(跨来源资源共享)Filter的异军突起,可能是由于两者在处理跨域请求的方式不同而导致的。Spring Security需要进行身份验证和授权,而CORS Filter是一个基于Web的安全工具,它帮助Web应用程序实现跨域请求。这两者之间的冲突可能会导致无法登录或提供受限制的访问。 下面是解决此问题的步骤: 1.…

    Java 2023年5月20日
    00
  • Java下载文件的4种方式总结

    以下是Java下载文件的4种方式总结的详细攻略: 一、通过URL类下载文件 Java中可以通过URL类来下载远程文件,具体步骤如下: 创建一个URL对象,指定远程文件的URL地址; URL url = new URL("http://example.com/file/file.txt"); 打开URL连接; URLConnection c…

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