
Executors可以帮助我们创建线程池,下面给大家介绍常见的5大Executors创建线程池的方式@mikechen
什么是Executors
Executors 是 Java 标准库中提供的一个工具类,用于创建和管理线程池。
Executors类创建线程池
Executors 类提供了一系列静态工厂方法,用于创建不同类型的线程池。
主要包含如下4大类,Executors 类返回的线程池实例都实现了 ExecutorService 接口。
1.newFixedThreadPool(int nThreads)
这个工厂方法创建一个固定大小的线程池,其中包含固定数量的线程。
如下所示:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FixedThreadPoolExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i++) {
final int taskNumber = i;
executorService.submit(() -> {
System.out.println("Task " + taskNumber + " executed by thread " + Thread.currentThread().getName());
});
}
executorService.shutdown();
}
}
如果提交的任务数超过线程池的大小,任务将会在队列中等待执行。
2.newCachedThreadPool()
创建一个可以自动调整大小的线程池,根据任务数量动态地创建和销毁线程。
如下所示:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CachedThreadPoolExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int taskNumber = i;
executorService.submit(() -> {
System.out.println("Task " + taskNumber + " executed by thread " + Thread.currentThread().getName());
});
}
executorService.shutdown();
}
}
适用于任务数不确定或任务持续时间较短的场景。
3.newSingleThreadExecutor()
创建一个只有一个线程的线程池,适用于需要保证任务顺序执行的场景。
如下所示:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SingleThreadExecutorExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int taskNumber = i;
executorService.submit(() -> {
System.out.println("Task " + taskNumber + " executed by thread " + Thread.currentThread().getName());
});
}
executorService.shutdown();
}
}
4.newScheduledThreadPool(int corePoolSize)
创建一个可以执行定时任务的线程池,可以指定核心线程数。
如下所示:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledThreadPoolExample {
public static void main(String[] args) {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
scheduledExecutorService.scheduleAtFixedRate(() -> {
System.out.println("Scheduled task executed by thread " + Thread.currentThread().getName());
}, 0, 1, TimeUnit.SECONDS);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
scheduledExecutorService.shutdown();
}
}
5.newWorkStealingPool(int parallelism)
创建一个工作窃取线程池,适用于可以将任务分成多个子任务并并行执行的场景。
如下所示:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class WorkStealingPoolExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newWorkStealingPool();
for (int i = 0; i < 10; i++) {
final int taskNumber = i;
executorService.submit(() -> {
System.out.println("Task " + taskNumber + " executed by thread " + Thread.currentThread().getName());
});
}
executorService.shutdown();
}
}
需要注意的是,虽然使用 Executors 可以方便地创建线程池,但在实际开发中,要根据业务需求和性能特点,选择合适的线程池类型和参数配置。
mikechen睿哥
10年+一线大厂架构实战专家,就职于阿里、淘宝等一线大厂,操盘多个亿级大厂核心项目。