深入源码分析Java线程池的实现原理

作者:CQITer小编 时间:2018-10-31 21:30

字号

程序的运行,其本质上,是对系统资源(CPU、内存、磁盘、网络等等)的使用。如何高效的使用这些资源是我们编程优化演进的一个方向。今天说的线程池就是一种对CPU利用的优化手段。

网上有不少介绍如何使用线程池的文章,那我想说点什么呢?我希望通过学习线程池原理,明白所有池化技术的基本设计思路。遇到其他相似问题可以解决。

深入源码分析Java线程池的实现原理

池化技术

前面提到一个名词——池化技术,那么到底什么是池化技术呢?

池化技术简单点来说,就是提前保存大量的资源,以备不时之需。在机器资源有限的情况下,使用池化技术可以大大的提高资源的利用率,提升性能等。

在编程领域,比较典型的池化技术有:

线程池、连接池、内存池、对象池等。

本文主要来介绍一下其中比较简单的线程池的实现原理,希望读者们可以举一反三,通过对线程池的理解,学习并掌握所有编程中池化技术的底层原理。

创建一个线程

Java的并发编程中,线程是十分重要的,在Java中,创建一个线程比较简单:

public class App { 

    public static void main(String[] args) throws Exception { 

        new Thread(new Runnable() { 

            @Override 

            public void run() { 

                System.out.println("线程运行中"); 

            } 

        }).start(); 

    } 

我们通过创建一个线程对象,并且实现Runnable接口就可以实现一个简单的线程。可以利用上多核CPU。当一个任务结束,当前线程就接收。

但很多时候,我们不止会执行一个任务。如果每次都是如此的创建线程->执行任务->销毁线程,会造成很大的性能开销。

那能否一个线程创建后,执行完一个任务后,又去执行另一个任务,而不是销毁。这就是线程池。

这也就是池化技术的思想,通过预先创建好多个线程,放在池中,这样可以在需要使用线程的时候直接获取,避免多次重复创建、销毁带来的开销。

线程池的简单使用

以下代码,是在Java中创建线程池:

import java.util.concurrent.*; 

 

public class App { 

    public static void main(String[] args) throws Exception { 

        ExecutorService executorService = new ThreadPoolExecutor(1, 1, 

                60L, TimeUnit.SECONDS, 

                new ArrayBlockingQueue<>(10)); 

 

        executorService.execute(new Runnable() { 

            @Override 

            public void run() { 

                System.out.println("abcdefg"); 

            } 

        }); 

 

        executorService.shutdown(); 

    } 

Jdk提供给外部的接口也很简单。直接调用ThreadPoolExecutor构造一个就可以了,也可以通过Executors静态工厂构建,但一般不建议。

责任编辑:CQITer新闻报料:400-888-8888   本站原创,未经授权不得转载
关键词 >>Java 线程池 源码
继续阅读
热新闻
推荐
关于我们联系我们免责声明隐私政策 友情链接