文章目录
- Executors快速创建线程以及管理线程池
- 简介
- Executors方法介绍
- 1. newFixedThreadPool
- 2. newSingleThreadExecutor
- 3. newCachedThreadPool
- 4. newScheduledThreadPool
- 5. newWorkStealingPool
简介
- Executors类属于java.util.concurrent包;
- 线程池的创建分为两种方式:ThreadPoolExecutor 和 Executors;
- Executors(静态Executor工厂)用于创建线程池;
- 工厂和工具方法Executor , ExecutorService , ScheduledExecutorService , ThreadFactory和Callable在此包中定义的类;
- newFixedThreadPool(int nThreads) 数量固定的线程池
- newSingleThreadExecutor() 单个线程的线程池
- newCachedThreadPool() 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
- newScheduledThreadPool(int corePoolSize) 周期性任务线程池
- newWorkStealingPool(int parallelism) 多个线程共有一个阻塞队列,而newWorkStealingPool 中每一个线程都有一个自己的队列,当线程发现自己的队列没有任务了,就会到别的线程的队列里获取任务执行。可以简单理解为”窃取“。
- 数量固定的线程池
public class ExecutorsDemo {
public static void print() {
System.out.println(Thread.currentThread().getName() + ":执行了");
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(4);
executorService.execute(() -> ExecutorsDemo.print());
executorService.execute(() -> ExecutorsDemo.print());
executorService.execute(() -> ExecutorsDemo.print());
executorService.execute(() -> ExecutorsDemo.print());
}
}
- 效果
- 单个线程线程池
public class ExecutorsDemo {
public static void print() {
System.out.println(Thread.currentThread().getName() + ":执行了");
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(() -> ExecutorsDemo.print());
executorService.execute(() -> ExecutorsDemo.print());
executorService.execute(() -> ExecutorsDemo.print());
executorService.execute(() -> ExecutorsDemo.print());
}
}
- 效果
- 可缓存线程池
public class ExecutorsDemo {
public static void print() {
System.out.println(Thread.currentThread().getName() + ":执行了");
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(() -> ExecutorsDemo.print());
executorService.execute(() -> ExecutorsDemo.print());
executorService.execute(() -> ExecutorsDemo.print());
executorService.execute(() -> ExecutorsDemo.print());
}
}
- 效果
- 执行定时性或周期性任务线程池
- schedule 延迟任务
- scheduleAtFixedRate 周期性任务,每1秒执行一次,不管当前任务是否结束
- scheduleWithFixedDelay 周期性任务,直到任务停止后新的任务计时才开始
public class ExecutorsDemo {
public static void print(String msg) {
System.out.println(Thread.currentThread().getName() + ":" + msg);
}
public static void main(String[] args) {
ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(4);
// 延迟5秒执行
scheduled.schedule(() -> ExecutorsDemo.print("延迟任务"), 5000, TimeUnit.MILLISECONDS);
// 周期性执行,首次延迟5秒,之后每1秒执行一次,不管当前任务是否结束
scheduled.scheduleAtFixedRate(() -> ExecutorsDemo.print("周期性任务1"), 5000, 1000, TimeUnit.MILLISECONDS);
// 周期性执行,首次延迟5秒,直到任务停止后新的任务计时才开始,1秒后执行
scheduled.scheduleWithFixedDelay(() -> ExecutorsDemo.print("周期性任务2"), 5000, 1000, TimeUnit.MILLISECONDS);
}
}
5. newWorkStealingPool
- 任务窃取线程池
public class ExecutorsDemo {
public static void print(String msg) {
System.out.println(Thread.currentThread().getName() + ":" + msg);
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newWorkStealingPool(4);
executorService.execute(() -> ExecutorsDemo.print("任务1"));
executorService.execute(() -> ExecutorsDemo.print("任务2"));
executorService.execute(() -> ExecutorsDemo.print("任务3"));
executorService.execute(() -> ExecutorsDemo.print("任务4"));
// 由于线程是抢占式,必须保持程序不终止,否则可能导致线程抢不到任务程序就终止了
while (true) {}
}
}
- 效果



