首页 > 编程语言 >Java并发基础:Executor接口和Executors类的区别

Java并发基础:Executor接口和Executors类的区别

时间:2024-01-22 10:01:55浏览次数:23  
标签:Java Executors 创建 任务 线程 提交 Executor

Java并发基础:Executor接口和Executors类的区别- 程序员古德

Executor是Java中的一个接口,它定义了一种将任务提交与任务执行机制(包括线程管理、调度等)分离的方式,Executors是一个工具类,它提供了多个静态工厂方法,用于创建不同类型的Executor实例。

代码案例

下面展示了如何使用Executor接口来执行异步任务,如下代码案例:

import java.util.concurrent.Executor;  
import java.util.concurrent.Executors;  
  
public class ExecutorExample {  
  
    public static void main(String[] args) {  
        // 创建一个单线程的Executor  
        Executor executor = Executors.newSingleThreadExecutor();  
  
        // 创建并提交几个任务  
        for (int i = 0; i < 5; i++) {  
            final int taskId = i;  
            executor.execute(() -> {  
                System.out.println("Task " + taskId + " is running by " + Thread.currentThread().getName());  
            });  
        }  
    }  
}

在这个例子中,创建了一个单线程的Executor,这意味着所有提交的任务都会按照提交的顺序(FIFO)在一个单独的线程中执行,通过调用executor.execute()方法来提交任务,每个任务都是一个Runnable对象(在这里使用了Lambda表达式来创建匿名内部类)。

下面展示了如何使用Executors,如下代代码:

import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
  
public class ExecutorsExample {  
  
    public static void main(String[] args) {  
        // 创建一个固定大小的线程池  
        ExecutorService executorService = Executors.newFixedThreadPool(3);  
  
        // 提交任务到线程池  
        for (int i = 0; i < 5; i++) {  
            final int taskId = i;  
            executorService.submit(() -> {  
                System.out.println("Task " + taskId + " is running by " + Thread.currentThread().getName());  
            });  
        }  
    }  
}

在这个例子中,使用Executors.newFixedThreadPool(3)创建了一个包含三个线程的固定大小的线程池,然后,提交了五个任务到线程池,由于线程池的大小是固定的,所以最多只有三个任务会同时执行,其余的任务会在队列中等待,直到线程池中有可用的线程。每个任务都是通过调用executorService.submit()方法提交的,该方法返回一个表示异步计算结果的Future对象。

核心总结

Java并发基础:Executor接口和Executors类的区别 - 程序员古德

1、Executor

定义:Executor是Java中的一个接口,它定义了一种将任务提交与任务执行机制(包括线程管理、调度等)分离的方式。

用途:Executor接口提供了一种标准的方法来启动和管理异步任务,而不需要直接操作线程或实现复杂的线程管理代码。

实现方式:Executor接口只有一个方法void execute(Runnable command),用于提交Runnable任务以供执行,具体的任务执行逻辑(如线程的创建、调度和管理)由实现Executor接口的类(如ThreadPoolExecutor)来负责。

2、Executors

定义:Executors是一个工具类,它提供了多个静态工厂方法,用于创建不同类型的Executor实例。

用途:Executors简化了Executor实例的创建过程,它隐藏了线程池的具体实现细节,让开发者能够更专注于任务的提交和执行。

实现方式:Executors类提供了多种创建Executor实例的方法,如:

  1. newFixedThreadPool(int nThreads):创建一个固定大小的线程池,可控制并发执行的线程数。
  2. newSingleThreadExecutor():创建一个单线程的Executor,确保所有任务按照提交的顺序(FIFO)执行。
  3. newCachedThreadPool():创建一个可根据需要创建新线程的线程池,可灵活调整线程数。

3、对比总结

Executor是一个接口,它定义了任务提交和执行的标准方法;而Executors是一个工具类,它提供了创建Executor实例的便捷方法,在实际开发中,通常会使用Executors来创建Executor实例,然后使用该实例来提交和管理异步任务。

关注我,每天学习互联网编程技术 - 程序员古德

END!

标签:Java,Executors,创建,任务,线程,提交,Executor
From: https://blog.51cto.com/bytegood/9360898

相关文章

  • [转]Java Stream API入门篇
    原文地址:JavaStreamAPI入门篇-CarpenterLee-博客园本文github地址你可能没意识到Java对函数式编程的重视程度,看看Java8加入函数式编程扩充多少功能就清楚了。Java8之所以费这么大功夫引入函数式编程,原因有二:代码简洁,函数式编程写出的代码简洁且意图明确,使用stream接口......
  • [转]Java Stream API进阶篇
    原文地址:JavaStreamAPI进阶篇-CarpenterLee-博客园本文github地址上一节介绍了部分Stream常见接口方法,理解起来并不困难,但Stream的用法不止于此,本节我们将仍然以Stream为例,介绍流的规约操作。规约操作(reductionoperation)又被称作折叠操作(fold),是通过某个连接动作将所有......
  • 一文搞清楚Java中的方法、常量、变量、参数
    写在开头在上一篇文章:一文搞清楚Java中的包、类、接口中我们讲了Java中的包、类和接口,今天继续将剩下的方法、常量、变量以及参数梳理完。Java中的变量与常量在JVM的运转中,承载的是数据,而数据的一种变现形式就是“量”,量分为:常量与变量,我们在数学和物理学中已经接触过变量的概......
  • Java 缓存池
    使用==对比的时候要注意,区分是int、Integer、newInteger。若是和int对比,不管是常量池还是堆的都会拆分成int,得到为true。若是和Integer对比,则要注意是否在缓存的范围之内即可。在java7之后,调用string.intern会判断字符串对象是否存在于缓存池,如果存在直接返回缓存池结果,如......
  • Java学习日记 Day6 JavaSE完结,步入正轨!!
    JavaSE:--------多线程--------①线程:线程在java中也是对象,也要创造线程类。②创建线程的三种方式:继承Thread:Thread是Runnable的实现类,而线程类进一步继承Thread类。实现Runnable:线程类直接对Runnable类进行实现。实现Callable:线程类实现Callable类。③线程的生命周期:线程从......
  • JAVA常用编码介绍
    ASCII码(最先采用的编码方式,专为英语使用)Unicode(为了克服ASCII码的缺点,方便其他国家使用,创造了Unicode意为统一编码的意思)UTF-8编码(为了克服Unicode编码的缺点:所有字符都用两个字节表示,浪费存储空间。为了节省空间又创造了UTF-8编码)......
  • Java基础语法
    Java基础语法基础阶段1、注释、标识符、关键字注释平时我们编写代码,在代码量比较少的时候,我们还可以看懂自己写的,但是当项目结构一旦复杂起来,我们就需要用到注释了。注释并不会被执行,是给我们写代码的人看的书写注释是一个非常好的习惯Java中的注释有三种:单行......
  • JAVA数据类型
    所有数据类型基本数据类型间的转换->自动类型转换->强制类型转换->基本数据类型间转换练习题基本数据类型和String类型间的转换->基本数据类型转为String类型->String数据类型转为基本数据类型......
  • 关于Java 数组
    了解Java数组Java中的数组是一种强大而灵活的数据结构,让我们一起深入探讨它的方方面面,从基础的概念到高级的应用。1.数组的创建与初始化首先,我们来看如何创建和初始化一个简单的整型数组:publicclassArrayExample{publicstaticvoidmain(String[]args){......
  • Java_讨论类加载器的双亲委派机制
    双亲委派机制简而言之,当某个类加载器在接到加载请求时,优先会将任务委托给父类加载器,一直到最顶层的类加载器,如果不能成功加载,才会尝试自己加载java.lang.ClassLoaderprotectedClass<?>loadClass(Stringname,booleanresolve)throwsClassNotFoundException{synchron......