java线程池源码的简单分析

  工作中用过线程池来进行多线程的操作,但是也仅仅是停留在使用方面,没有深入研究,现在通过源码来仔细研究下java的线程池。关于线程池的优缺点就不研究了,直接通过一个源码来看看java中线程池的原理。

  使用ThreadPoolExecutor来创建一个线程池

public class MultipleThread {
    public static void main(String[] args) {
        /**
         * 通过ThreadPoolExecutor来创建一个线程池
         *
         * 我们创建的线程池  核心线程数为10,最大线程数为10,也就是线程池的大小就是为10个线程
         *
         * 非核心线程的在没有任务执行的时候存活的时间设置为0,时间单位是毫秒(设置为0意味着不过期,不会超时被回收)
         *
         * LinkedBlockingQueue作为工作队列,用于存储工作任务
         */

        ExecutorService executorService = new ThreadPoolExecutor(10, 10,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>());
        Future<?> a = executorService.submit(() ->
            System.out.println("当前线程:" + Thread.currentThread().getName())
        );
        Future<?> aa = executorService.submit(() ->
                System.out.println("当前线程:" + Thread.currentThread().getName()));
        Future<?> aaa = executorService.submit(() ->
                System.out.println("当前线程:" + Thread.currentThread().getName()));
        Future<?> aaaa = executorService.submit(() ->
                System.out.println("当前线程:" + Thread.currentThread().getName()));
        Future<?> aaaaa = executorService.submit(() ->
                System.out.println("当前线程:" + Thread.currentThread().getName()));

    }
}

  我们通过ThreadPoolExecutor的构造函数来看看线程池是怎么创建的

ThreadPoolExecutor构造方法:

  提交一个任务

提交任务后,其实是调用execute方法去向工作队列添加任务的,我们接着看这个execute方法的实现。

总结就是:

1、当前活动线程数小于核心线程数,则创建一个核心线程,并执行提交的任务

2、当前活动线程数大于等于核心线程数,并且队列可以添加任务,则将任务添加到队列中去

3、当前活动线程数大于等于核心线程数,并且队列不能添加任务(队列满了),则创建一个非核心线程来处理提交的任务

接下来我们看addWorker这个方法

接下来我们看runWorker方法

我们再看下getTask()方法,这个方法就是线程复用的关键方法。

好了,初步的源码分析就到这儿。

原文地址:https://www.cnblogs.com/guolinjiang/p/12111281.html

时间: 2024-10-09 04:47:03

java线程池源码的简单分析的相关文章

java线程池源码解读

java线程池的顶级类是Executors 内置了几种线程池 1.newFixedThreadPool  并且重载了两个此方法  有固定线程数的线程池 当达到设置的线程数时 多余的任务会排队,当处理完一个马上就会去接着处理排队中的任务 源码如下 public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit

Java线程池源码阅读

简单介绍 线程池是池化技术的一种,对线程复用.资源回收.多任务执行有不错的实践.阅读源码,可以学习jdk的大师对于线程并发是怎么池化的,还有一些设计模式.同时,它也能给我们在使用它的时候多一种感知,出了什么问题可以马上意识到哪里的问题. 使用范例 我们使用一个线程池,直接通过jdk提供的工具类直接创建.使用如下api创建一个固定线程数的线程池. ExecutorService pool = Executors.newFixedThreadPool(5); 使用如下api创建一个会不断增长线程的线

java线程池源码的理解

线程池 所谓线程池,就是有一个池子,里面存放着已经创建好的线程,当有任务提交到线程池执行时,池子中的某个线程会主动执行该任务. 新建线程和切换线程的开销太大了,使用线程池可以节省系统资源. 线程池的关键类:ThreadPoolExecutor 主要流程 execute() –> addWorker() –>runWorker() -> getTask() 重要参数及变量 控制状态的变量 ctl: ctl是一个AtomicInteger原子操作类,能够保证线程安全. ctl变量定义如下:

面试官:你分析过线程池源码吗?

线程池源码也是面试经常被提问到的点,我会将全局源码做一分析,然后告诉你面试考啥,怎么答. 为什么要用线程池? 简洁的答两点就行. 降低系统资源消耗. 提高线程可控性. 如何创建使用线程池? JDK8提供了五种创建线程池的方法: 1.创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待. 1 public static ExecutorService newFixedThreadPool(int nThreads) { 2 return new ThreadPoolExecutor(

Java并发编程中线程池源码分析及使用

当Java处理高并发的时候,线程数量特别的多的时候,而且每个线程都是执行很短的时间就结束了,频繁创建线程和销毁线程需要占用很多系统的资源和时间,会降低系统的工作效率. 参考http://www.cnblogs.com/dolphin0520/p/3932921.html 由于原文作者使用的API 是1.6 版本的,参考他的文章,做了一些修改成 jdk 1.8版本的方法,涉及到的内容比较多,可能有少许错误. API : jdk1.8.0_144 ThreadPoolExecutor类 Java中线

分析线程池源码测试线程池

import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * 线程池测试类 */ public class TestThreadPool { public static void main(String[] args) { // 实例化线程池对象 corePoolSize--线程池

手撕ThreadPoolExecutor线程池源码

这篇文章对ThreadPoolExecutor创建的线程池如何操作线程的生命周期通过源码的方式进行详细解析.通过对execute方法.addWorker方法.Worker类.runWorker方法.getTask方法.processWorkerExit从源码角度详细阐述,文末有彩蛋. exexcte方法 public void execute(Runnable command) { if (command == null) throw new NullPointerException(); in

nginx线程池源码解析

周末看了nginx线程池部分的代码,顺手照抄了一遍,写成了自己的版本.实现上某些地方还是有差异的,不过基本结构全部摘抄. 在这里分享一下.如果你看懂了我的版本,也就证明你看懂了nginx的线程池. 本文只列出了关键数据结构和API,重在理解nginx线程池设计思路.完整代码在最后的链接里. 1.任务节点 typedef void (*CB_FUN)(void *); //任务结构体 typedef struct task { void *argv; //任务函数的参数(任务执行结束前,要保证参数

线程池源码解析

ThreadPoolExecutor的几个重要属性 BlockingQueue workQueue 阻塞队列.存放将要执行的任务 HashSet workers 当前线程池的线程集合.下文会重点介绍Worker这个内部类 corePoolSize 核心线程数 maximumPoolSize 最大线程数 keepAliveTime 非核心线程保持空闲的最长时间 allowCoreThreadTimeOut 核心线程是否被回收.默认是不回收核心线程的 RejectedExecutionHandler