获取线程池中任务执行数量

通过线程池进行任务处理,有时我们需要知道线程池中任务的执行状态。

通过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可以获取不断变化的线程及线程任务数量了。

猜你喜欢

转载自my.oschina.net/u/1000241/blog/1807703
今日推荐