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对象。
核心总结
1、Executor
定义:Executor是Java中的一个接口,它定义了一种将任务提交与任务执行机制(包括线程管理、调度等)分离的方式。
用途:Executor接口提供了一种标准的方法来启动和管理异步任务,而不需要直接操作线程或实现复杂的线程管理代码。
实现方式:Executor接口只有一个方法void execute(Runnable command),用于提交Runnable任务以供执行,具体的任务执行逻辑(如线程的创建、调度和管理)由实现Executor接口的类(如ThreadPoolExecutor)来负责。
2、Executors
定义:Executors是一个工具类,它提供了多个静态工厂方法,用于创建不同类型的Executor实例。
用途:Executors简化了Executor实例的创建过程,它隐藏了线程池的具体实现细节,让开发者能够更专注于任务的提交和执行。
实现方式:Executors类提供了多种创建Executor实例的方法,如:
- newFixedThreadPool(int nThreads):创建一个固定大小的线程池,可控制并发执行的线程数。
- newSingleThreadExecutor():创建一个单线程的Executor,确保所有任务按照提交的顺序(FIFO)执行。
- newCachedThreadPool():创建一个可根据需要创建新线程的线程池,可灵活调整线程数。
3、对比总结
Executor是一个接口,它定义了任务提交和执行的标准方法;而Executors是一个工具类,它提供了创建Executor实例的便捷方法,在实际开发中,通常会使用Executors来创建Executor实例,然后使用该实例来提交和管理异步任务。