自己动手写线程池——向JDK线程池进发( 五 )

线程池测试package cscore.concurrent.java.threadpoolv2;import java.util.concurrent.ExecutionException;import java.util.concurrent.RunnableFuture;import java.util.concurrent.TimeUnit;public class Test {  public static void main(String[] args) throws InterruptedException, ExecutionException {    var pool = new ThreadPool(2, 5, TimeUnit.SECONDS, 10, RejectPolicy.ABORT, 100000);    for (int i = 0; i < 10; i++) {      RunnableFuture<Integer> submit = pool.submit(() -> {        System.out.println(Thread.currentThread().getName() + " output a");        try {          Thread.sleep(10);        } catch (InterruptedException e) {          e.printStackTrace();        }        return 0;      });      System.out.println(submit.get());    }    int n = 15;    while (n-- > 0) {      System.out.println("Number Threads = " + pool.getCt());      Thread.sleep(1000);    }    pool.shutDown();  }}上面测试代码的输出结果如下所示:
ThreadPool-Thread-2 output aThreadPool-Thread-1 output aThreadPool-Thread-3 output aThreadPool-Thread-4 output aNumber Threads = 5ThreadPool-Thread-5 output aThreadPool-Thread-2 output aThreadPool-Thread-1 output aThreadPool-Thread-3 output aThreadPool-Thread-4 output aThreadPool-Thread-5 output aThreadPool-Thread-2 output aThreadPool-Thread-1 output aThreadPool-Thread-4 output aThreadPool-Thread-3 output aThreadPool-Thread-5 output aThreadPool-Thread-2 output aThreadPool-Thread-1 output aThreadPool-Thread-4 output aNumber Threads = 5Number Threads = 5Number Threads = 5Number Threads = 5Number Threads = 5Number Threads = 5Number Threads = 5Number Threads = 5Number Threads = 5Number Threads = 3Number Threads = 2Number Threads = 2Number Threads = 2Number Threads = 2从上面的代码可以看出我们实现了正确的任务实现结果,同时线程池当中的核心线程数从 2 变到了 5  , 当线程池当中任务队列全部别执行完成之后,线程的数目重新降下来了,这确实是我们想要达到的结果 。
总结在本篇文章当中主要给大家介绍了如何实现一个类似于JDK中的线程池,里面有非常多的实现细节,大家可以仔细捋一下其中的流程,对线程池的理解将会非常有帮助 。

推荐阅读