线程池(Thread Pool)是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。
Java通过Executor
框架提供线程池的支持。Executor
框架是一个接口,它定义了一个执行任务的方法execute(Runnable command)
。ExecutorService
是Executor
的子接口,提供了更丰富的线程池管理功能。
Java提供了Executors
工厂类来创建不同类型的线程池:
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
线程池的核心参数包括:
keepAliveTime
的时间单位。corePoolSize
,如果是,则创建新线程执行任务。corePoolSize
,则将任务放入workQueue
中等待执行。workQueue
已满且当前线程数小于maximumPoolSize
,则创建新线程执行任务。workQueue
已满且当前线程数等于maximumPoolSize
,则根据handler
策略处理任务。当线程池无法处理新任务时,会触发拒绝策略。Java提供了四种内置的拒绝策略:
RejectedExecutionException
异常。可以通过execute()
方法提交任务,也可以通过submit()
方法提交任务并获取Future
对象。
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.execute(() -> {
// 任务代码
});
Future<?> future = executor.submit(() -> {
// 任务代码
});
可以通过shutdown()
方法平滑地关闭线程池,或者通过shutdownNow()
方法立即关闭线程池。
executor.shutdown(); // 平滑关闭
executor.shutdownNow(); // 立即关闭
可以通过ThreadPoolExecutor
提供的方法监控线程池的状态:
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
int poolSize = executor.getPoolSize();
int activeCount = executor.getActiveCount();
long completedTaskCount = executor.getCompletedTaskCount();
long taskCount = executor.getTaskCount();
线程池的大小设置需要根据具体的应用场景和系统资源来决定。通常可以通过以下公式估算:
corePoolSize = CPU核心数 + 1
corePoolSize = CPU核心数 * 2
任务队列的选择对线程池的性能有很大影响。常用的队列有:
可以通过自定义线程工厂来设置线程的名称、优先级等属性,方便调试和监控。
ThreadFactory threadFactory = new ThreadFactory() {
private final AtomicInteger threadNumber = new AtomicInteger(1);
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r, "my-thread-" + threadNumber.getAndIncrement());
thread.setPriority(Thread.NORM_PRIORITY);
return thread;
}
};
ExecutorService executor = Executors.newFixedThreadPool(5, threadFactory);
可以通过实现RejectedExecutionHandler
接口来自定义拒绝策略,以满足特定的业务需求。
RejectedExecutionHandler handler = new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// 自定义拒绝策略
}
};
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100), handler);
线程池是Java并发编程中非常重要的工具,合理使用线程池可以显著提高系统的性能和稳定性。通过理解线程池的工作原理、核心参数、拒绝策略以及优化方法,可以更好地在实际项目中应用线程池,提升系统的并发处理能力。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4248433/blog/4611897