jdk自带的线程池有ThreadPoolExecutor、ScheduledExecutorService、ScheduledThreadPoolExecutor、ExecutorService,我们可以使用工具类Executors来创建。简单看看线程池ThreadPoolExecutor的实现原理。
1.使用线程池的原因
由于创建和回收线程的成本比较高,所以我们会使用线程池来减少线程的频繁创建和回收。而我们所说的创建线程并不是指new Thread()而是指调用start()方法。细想一下确实如此,因为new Thread()只是操作java的内存,并没有和操作系统进行交互,而start()方法才会调用native()方法去创建进程,这才是成本高的原因(见:https://www.cnblogs.com/sunnybug/p/5568626.html)。所以我们如果使用线程池的目的就是要减少start()方法的调用。然后想象一下,如果要你来实现线程池,是不是觉得原理其实很简单呢?
2.ThreadPoolExecutor 的实现原理
是的。ThreadPoolExecutor其实就是创建了几个线程,一直不停的进行while()循环,在每一次循环中的操作就是:取出咱们想要执行的Runnable,然后调用Runnable的run()方法。因为调用的是run()方法,不会涉及到操作系统创建新进程的操作,而是和调用任何一个其他java方法一样,所以就减少了线程的创建和回收。
当然,除此之外,还会有其他功能:remove()、shutdown()、awaitTermination()以及keepAliveTime的概念等。