通过线程池进行任务处理,有时我们需要知道线程池中任务的执行状态。
通过ThreadPoolExecutor的相关API实时获取线程数量,排队任务数量,执行完成线程数量等信息。
实例
private
static
ExecutorService
es =
new
ThreadPoolExecutor
(
50
,
100
,
0L
,
TimeUnit
.MILLISECONDS,
new
LinkedBlockingQueue
<
Runnable
>(
100000
));
public
static
void
main(
String
[] args)
throws
Exception
{
for
(
int
i =
0
; i <
100000
; i++) {
es.execute(() -> {
System
.
out
.
print
(
1
);
try
{
Thread
.sleep(
1000
);
}
catch
(
InterruptedException
e) {
e.printStackTrace();
}
});
}
ThreadPoolExecutor
tpe = ((
ThreadPoolExecutor
) es);
while
(
true
) {
System
.
out
.println();
int
queueSize = tpe.getQueue().size();
System
.
out
.println(
"当前排队线程数:"
+ queueSize);
int
activeCount = tpe.getActiveCount();
System
.
out
.println(
"当前活动线程数:"
+ activeCount);
long
completedTaskCount = tpe.getCompletedTaskCount();
System
.
out
.println(
"执行完成线程数:"
+ completedTaskCount);
long
taskCount = tpe.getTaskCount();
System
.
out
.println(
"总线程数:"
+ taskCount);
Thread
.sleep(
3000
);
}
}
比如我们每隔3秒获取一次执行状态信息,总共有50个工作线程。
第一次输出:
当前排队线程数:
99950
当前活动线程数:
50
执行完成线程数:
0
总线程数(排队线程数 + 活动线程数 + 执行完成线程数):
100000
第二次输出:
当前排队线程数:
99800
当前活动线程数:
50
执行完成线程数:
150
总线程数(排队线程数 + 活动线程数 + 执行完成线程数):
100000
说明通过API可以获取不断变化的线程及线程任务数量了。