Java中的线程池是指一组预先初始化的线程,可以重复使用来执行多个并发任务,以减少线程的创建和销毁的开销,提高程序的性能和可靠性。
Java中的线程池可以通过java.util.concurrent包中的ThreadPoolExecutor类进行创建和管理。ThreadPoolExecutor类主要有以下几个参数:
- corePoolSize:线程池中的核心线程数;
- maximumPoolSize:线程池中的最大线程数;
- keepAliveTime:线程池中空闲线程的存活时间;
- workQueue:阻塞队列,用于存放待执行的任务;
- threadFactory:线程工厂,用于创建线程;
- handler:拒绝策略,用于处理任务添加到线程池中失败的情况。
下面是一个具体的示例说明:
public class ThreadPoolExample {
public static void main(String[] args) {
// 创建线程池,核心线程数为2,最大线程数为4,空闲线程存活时间为30秒,并使用LinkedBlockingQueue阻塞队列
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 30L, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
// 提交任务到线程池中
for (int i = 1; i <= 6; i++) {
executor.execute(new CustomTask(i));
}
// 关闭线程池
executor.shutdown();
}
static class CustomTask implements Runnable {
private int taskId;
public CustomTask(int taskId) {
this.taskId = taskId;
}
@Override
public void run() {
System.out.println("正在执行任务 " + taskId + ",线程名为 " + Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
上面的示例中,我们创建了一个线程池,核心线程数为2,最大线程数为4,空闲线程存活时间为30秒,并使用LinkedBlockingQueue阻塞队列。然后我们向线程池中提交了6个任务对象,每个任务执行时间为2秒。线程池会根据核心线程数和阻塞队列中待执行任务数来动态调整线程池中线程的数量,以确保任务能够被尽可能快地执行完毕。
下面是另外一个示例,它演示了如何使用ThreadPoolExecutor类的拒绝策略处理任务添加到线程池中失败的情况:
public class ThreadPoolExample {
public static void main(String[] args) {
// 创建线程池,核心线程数为2,最大线程数为4,空闲线程存活时间为30秒,并使用LinkedBlockingQueue阻塞队列,拒绝策略为AbortPolicy
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 30L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(2),
Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
// 提交任务到线程池中
for (int i = 1; i <= 6; i++) {
executor.execute(new CustomTask(i));
}
// 关闭线程池
executor.shutdown();
}
static class CustomTask implements Runnable {
private int taskId;
public CustomTask(int taskId) {
this.taskId = taskId;
}
@Override
public void run() {
System.out.println("正在执行任务 " + taskId + ",线程名为 " + Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
上面的示例中,我们使用了AbortPolicy拒绝策略。当线程池中的阻塞队列已满,且线程池中的线程数已达到最大线程数时,如果有任务需要提交到线程池中去,那么线程池就会拒绝接受该任务,并抛出RejectedExecutionException异常。