在 Java 中,线程池的状态是由 java.util.concurrent.ThreadPoolExecutor
类管理的。ThreadPoolExecutor
是 ExecutorService
的一个实现,提供了对线程池的详细控制。线程池的状态可以通过 getPoolSize
、getActiveCount
、getTaskCount
、getCompletedTaskCount
等方法来获取。
线程池的状态属性
getPoolSize
:
- 返回线程池中的当前线程数。
getActiveCount
:
- 返回线程池中当前正在执行任务的线程数。
getTaskCount
:
- 返回线程池启动以来已经执行的任务总数,包括已提交但尚未开始执行的任务。
getCompletedTaskCount
:
- 返回线程池已经完成的任务数。
getLargestPoolSize
:
- 返回线程池曾经达到的最大线程数。
getQueue
:
- 返回线程池的任务队列,包含已提交但尚未开始执行的任务。
示例代码
以下是一个示例,展示了如何创建一个线程池并获取其状态信息:
import java.util.concurrent.*;
public class ThreadPoolStatusExample {
public static void main(String[] args) {
// 创建一个固定大小的线程池
int corePoolSize = 2;
int maximumPoolSize = 4;
long keepAliveTime = 60L;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(10);
ThreadFactory threadFactory = Executors.defaultThreadFactory();
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
unit,
workQueue,
threadFactory,
handler
);
// 提交一些任务
for (int i = 0; i < 10; i++) {
final int taskId = i;
executor.submit(() -> {
System.out.println("Executing task " + taskId + " by " + Thread.currentThread().getName());
try {
Thread.sleep(2000); // 模拟任务执行时间
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
// 获取线程池状态
printThreadPoolStatus(executor);
// 关闭线程池
executor.shutdown();
try {
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
}
// 再次获取线程池状态
printThreadPoolStatus(executor);
}
private static void printThreadPoolStatus(ThreadPoolExecutor executor) {
System.out.println("------ ThreadPool Status ------");
System.out.println("Pool Size: " + executor.getPoolSize());
System.out.println("Active Threads: " + executor.getActiveCount());
System.out.println("Number of Tasks Completed: " + executor.getCompletedTaskCount());
System.out.println("Total Tasks: " + executor.getTaskCount());
System.out.println("Largest Pool Size: " + executor.getLargestPoolSize());
System.out.println("Core Pool Size: " + executor.getCorePoolSize());
System.out.println("Maximum Pool Size: " + executor.getMaximumPoolSize());
System.out.println("Queue Size: " + executor.getQueue().size());
System.out.println("-----------------------------");
}
}
代码解释
- 创建线程池:
- 使用
ThreadPoolExecutor
构造函数创建一个固定大小的线程池。 - 参数包括核心线程数、最大线程数、线程空闲时间、时间单位、任务队列、线程工厂和拒绝策略。
- 提交任务:
- 使用
executor.submit
方法提交多个任务到线程池。
- 获取线程池状态:
- 调用
printThreadPoolStatus
方法打印线程池的各种状态信息。
- 关闭线程池:
- 使用
executor.shutdown
方法平滑关闭线程池,等待所有已提交的任务完成。 - 使用
executor.awaitTermination
方法等待线程池中的所有任务完成,超时后强制关闭线程池。
- 打印线程池状态:
printThreadPoolStatus
方法打印线程池的各种状态信息,包括线程数、活动线程数、已完成任务数、总任务数、最大线程数、核心线程数、任务队列大小等。
通过这些方法,可以全面了解线程池的当前状态,从而更好地管理和优化线程池的性能。
标签:状态,程池,java,System,任务,线程,executor,println,out From: https://blog.51cto.com/u_16390833/12259901