ThreadPoolExecutor
相关参数:
- corePoolSize: 线程池中的核心线程数,默认情况下,核心线程会一直存活,即使它们是空的。
- maximumPoolSize: 线程池中的最大线程数,默认情况下,线程池中的线程数不会超过这个值。
- keepAliveTime: 当线程数大于核心线程数时,多余的空闲线程会在多长时间内被销毁。
- unit: keepAliveTime参数的单位。
- workQueue: 线程池中的任务队列,用于存放待处理的任务。
- ArrayBlockingQueue:有界队列,容量固定。
- LinkedBlockingQueue:无界队列(默认容量为 Integer.MAX_VALUE),可能导致内存溢出。
- SynchronousQueue:不存储元素的队列,每个插入操作必须等待另一个线程的移除操作。
- PriorityBlockingQueue:带优先级的无界队列
- threadFactory: 创建新线程的工厂,默认情况下,线程池会创建新的线程
- handler: 当线程池中的任务队列已满时(拒绝策略)
- AbortPolicy:默认策略,直接抛出 RejectedExecutionException 异常。
- DiscardPolicy:直接丢弃任务,不抛出异常。
- DiscardOldestPolicy:丢弃队列中最旧的任务,然后重新尝试执行任务。
- CallerRunsPolicy:调用者所在的线程来执行任务。
几种创建方式
通过 Executors 创建的线程池
通过 ThreadPoolExecutor 创建的线程池
Executors.newFixedThreadPool:创建⼀个固定⼤⼩的线程池,可控制并发的线程数,超出的线程会在队列中等待
Executors.newCachedThreadPool:创建⼀个可缓存的线程池,若线程数超过处理所需,缓存⼀段时间后会回收,若线程数不够,则新建线程
Executors.newSingleThreadExecutor:创建单个线程数的线程池,它可以保证先进先出的执⾏顺序
Executors.newScheduledThreadPool:创建⼀个可以执⾏延迟任务的线程池
Executors.newSingleThreadScheduledExecutor:创建⼀个单线程的可以执⾏延迟任务的线程池
Executors.newWorkStealingPool:创建⼀个抢占式执⾏的线程池(任务执⾏顺序不确定)【JDK1.8 添加】
ThreadPoolExecutor:最原始的创建线程池的⽅式,它包含了 7 个参数可供设置,后⾯会详细讲
Executors 创建的线程池(demo)
package com.jysemel.java.basic.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorsDemo {
public static void main(String[] args) {
// 创建一个线程池
ExecutorService executor = Executors.newCachedThreadPool();
// 创建10个任务并执行
for (int i = 0; i < 10; i++) {
executor.execute( () -> {
System.out.println(Thread.currentThread().getName() + "正在执行");
});
}
// 结束任务
executor.shutdown();
}
}
ThreadPoolExecutor 创建的线程池(demo)
package com.jysemel.java.basic.thread;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class ThreadPoolExample {
protected static final AtomicInteger count = new AtomicInteger(1);
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(4),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy()
);
for (int i = 0; i < 10; i++) {
executor.execute(() -> {
System.out.println(Thread.currentThread().getName() + " 执行任务");
try {
count.getAndAdd(1);
Thread.sleep(TimeUnit.SECONDS.toMillis(10));
} catch (InterruptedException e) {
System.out.println("--------------");
}
});
}
System.out.println("所有任务提交完毕" + count.get());
executor.shutdown();
}
}
