目录
fork/join任务池
- getPoolSize():当前线程池内工作线程的数量
- getParallelism():并行级别
- getActiveThreadCount():正在执行任务的线程数
- getRunningThreadCount():正在运行的(没有被阻塞的)工作线程数
- getQueuedSubmissionCount():提交到线程池中,但尚未开始执行的任务数量
- getQueuedTaskCount():提交到线程池中,已经开始执行任务的数量
- getStealCount():工作线程队列从另外一个工作线程队列中窃取的全部任务数量。
一、主程序
package xyz.jangle.thread.test.n9_5.testforkjoin;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.TimeUnit;
/**
* 9.5、监测fork/join任务池
*
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年10月24日 下午4:34:27
*
*/
public class M {
public static void main(String[] args) throws InterruptedException {
ForkJoinPool pool = new ForkJoinPool();
int array[] = new int[10000];
var task = new Task(array, 0, array.length);
pool.execute(task);
while (!task.isDone()) {
showLog(pool);
TimeUnit.SECONDS.sleep(1);
}
pool.shutdown();
pool.awaitTermination(1, TimeUnit.DAYS);
showLog(pool);
System.out.println("M:End ");
}
private static void showLog(ForkJoinPool pool) {
System.out.println("*****************************");
System.out.println("pool.getParallelism():" + pool.getParallelism());
System.out.println("pool.getPoolSize():" + pool.getPoolSize());
System.out.println("pool.getActiveThreadCount():" + pool.getActiveThreadCount());
System.out.println("pool.getRunningThreadCount():" + pool.getRunningThreadCount());
System.out.println("pool.getQueuedSubmissionCount():" + pool.getQueuedSubmissionCount());
System.out.println("pool.getQueuedTaskCount():" + pool.getQueuedTaskCount());
System.out.println("pool.hasQueuedSubmissions():" + pool.hasQueuedSubmissions());
System.out.println("pool.getStealCount():" + pool.getStealCount());
System.out.println("pool.isTerminated():" + pool.isTerminated());
System.out.println("*****************************");
}
}
二、任务类
package xyz.jangle.thread.test.n9_5.testforkjoin;
import java.util.concurrent.RecursiveAction;
/**
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年10月24日 下午4:41:58
*
*/
@SuppressWarnings("serial")
public class Task extends RecursiveAction {
private final int array[];
private final int start, end;
public Task(int[] array, int start, int end) {
super();
this.array = array;
this.start = start;
this.end = end;
}
@Override
protected void compute() {
if (end - start > 100) {
int mid = (start + end) / 2;
var task1 = new Task(array, start, mid);
var task2 = new Task(array, mid, end);
task1.fork();
task2.fork();
task1.join();
task2.join();
} else {
for (int i = start; i < end; i++) {
array[i]++;
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
三、执行结果
*****************************
pool.getParallelism():8
pool.getPoolSize():1
pool.getActiveThreadCount():1
pool.getRunningThreadCount():1
pool.getQueuedSubmissionCount():0
pool.getQueuedTaskCount():1
pool.hasQueuedSubmissions():false
pool.getStealCount():0
pool.isTerminated():false
*****************************
*****************************
pool.getParallelism():8
pool.getPoolSize():8
pool.getActiveThreadCount():7
pool.getRunningThreadCount():0
pool.getQueuedSubmissionCount():0
pool.getQueuedTaskCount():16
pool.hasQueuedSubmissions():false
pool.getStealCount():0
pool.isTerminated():false
*****************************
*****************************
pool.getParallelism():8
pool.getPoolSize():8
pool.getActiveThreadCount():7
pool.getRunningThreadCount():0
pool.getQueuedSubmissionCount():0
pool.getQueuedTaskCount():22
pool.hasQueuedSubmissions():false
pool.getStealCount():4
pool.isTerminated():false
*****************************
*****************************
pool.getParallelism():8
pool.getPoolSize():8
pool.getActiveThreadCount():7
pool.getRunningThreadCount():0
pool.getQueuedSubmissionCount():0
pool.getQueuedTaskCount():15
pool.hasQueuedSubmissions():false
pool.getStealCount():4
pool.isTerminated():false
*****************************
*****************************
pool.getParallelism():8
pool.getPoolSize():8
pool.getActiveThreadCount():7
pool.getRunningThreadCount():0
pool.getQueuedSubmissionCount():0
pool.getQueuedTaskCount():20
pool.hasQueuedSubmissions():false
pool.getStealCount():4
pool.isTerminated():false
*****************************
*****************************
pool.getParallelism():8
pool.getPoolSize():8
pool.getActiveThreadCount():7
pool.getRunningThreadCount():0
pool.getQueuedSubmissionCount():0
pool.getQueuedTaskCount():6
pool.hasQueuedSubmissions():false
pool.getStealCount():4
pool.isTerminated():false
*****************************
*****************************
pool.getParallelism():8
pool.getPoolSize():8
pool.getActiveThreadCount():7
pool.getRunningThreadCount():0
pool.getQueuedSubmissionCount():0
pool.getQueuedTaskCount():11
pool.hasQueuedSubmissions():false
pool.getStealCount():5
pool.isTerminated():false
*****************************
*****************************
pool.getParallelism():8
pool.getPoolSize():8
pool.getActiveThreadCount():7
pool.getRunningThreadCount():0
pool.getQueuedSubmissionCount():0
pool.getQueuedTaskCount():4
pool.hasQueuedSubmissions():false
pool.getStealCount():5
pool.isTerminated():false
*****************************
*****************************
pool.getParallelism():8
pool.getPoolSize():8
pool.getActiveThreadCount():6
pool.getRunningThreadCount():0
pool.getQueuedSubmissionCount():0
pool.getQueuedTaskCount():2
pool.hasQueuedSubmissions():false
pool.getStealCount():5
pool.isTerminated():false
*****************************
*****************************
pool.getParallelism():8
pool.getPoolSize():0
pool.getActiveThreadCount():0
pool.getRunningThreadCount():0
pool.getQueuedSubmissionCount():0
pool.getQueuedTaskCount():0
pool.hasQueuedSubmissions():false
pool.getStealCount():18
pool.isTerminated():true
*****************************
M:End