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

时间:2024-01-22 14:23:13

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!