固定大小的线程池限制了可以并行执行的任务数量,当任务数量超过线程池大小时,任务会被放入缓冲队列中等待空闲线程执行。Java提供了ExecutorService接口和ThreadPoolExecutor类来实现线程池,以下是Java如何固定大小的线程池的完整攻略。
创建线程池
使用ThreadPoolExecutor类创建线程池,可以通过指定以下参数来控制线程池的大小:
- corePoolSize:线程池核心线程数,线程池中始终保持的活跃线程数;
- maximumPoolSize:线程池最大线程数,线程池中最多同时执行的线程数;
- keepAliveTime:非核心线程闲置超时时间,在超时时间内非核心线程会被回收;
- TimeUnit:keepAliveTime的时间单位;
- BlockingQueue:任务等待队列,缓存待执行任务,常用BlockingQueue的实现类有ArrayBlockingQueue、LinkedBlockingQueue等。
以下是示例代码:
int corePoolSize = 10;
int maximumPoolSize = 20;
long keepAliveTime = 60;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100);
ExecutorService executorService = new ThreadPoolExecutor(
corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
在这个示例中,线程池的核心线程数为10,最大线程数为20,闲置线程超时时间为60秒,等待队列大小为100。
提交任务
可以使用submit或execute方法将任务提交到线程池中:
executorService.submit(() -> System.out.println("Hello, World!"));
executorService.execute(() -> System.out.println("Hello, World!"));
关闭线程池
当不再需要线程池时,需要手动关闭线程池以释放资源。可以使用shutdown和shutdownNow方法关闭线程池:
executorService.shutdown(); // 优雅关闭,等待正在执行的任务完成后关闭
executorService.shutdownNow(); // 粗暴关闭,立即中断所有任务并释放资源
以下是一个完整的示例代码,演示了如何创建固定大小的线程池并提交任务,待任务执行完成后优雅关闭线程池:
import java.util.concurrent.*;
public class FixedThreadPoolExample {
public static void main(String[] args) throws InterruptedException {
int corePoolSize = 10;
int maximumPoolSize = 20;
long keepAliveTime = 60;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100);
ExecutorService executorService = new ThreadPoolExecutor(
corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
for (int i = 0; i < 50; i++) {
executorService.submit(() -> {
System.out.println(Thread.currentThread().getName() + " started...");
try {
Thread.sleep(1000); // 模拟耗时任务
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName() + " completed.");
});
}
executorService.shutdown(); // 优雅关闭线程池
executorService.awaitTermination(1, TimeUnit.MINUTES); // 等待线程池中的任务执行完成
}
}
这个示例代码创建了一个最大线程数为20的线程池,提交了50个任务,每个任务模拟了1秒的耗时,待任务执行完成后优雅关闭线程池,等待1分钟以确保线程池中的任务都执行完成。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java如何固定大小的线程池 - Python技术站