`
生活的聆听者
  • 浏览: 17216 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java线程池原理浅析

 
阅读更多

     线程池是Java开发中常用的功能,在日常开发经常用到,那对于其的实现原理是否了解?下面就线程池的原理做个简单的分析。就从最简单的使用开始来分析具体实现和领悟JDK 实现的基本思想。

  

  • 最简单的线程池使用方式

             

  ExecutorService service = Executors.newFixedThreadPool(10);
  service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("executor");
            }
        });

      上面是最简单的线程池使用方式,那线程池是如何运行该提交的执行任务的呢?下来分两步来分析:

  1. 线程池的初始化,下面是Executors类里面的初始化线程池的方法:

 

        

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

        根据上面newFixedThreadPool方法来看,只是返回了一个ThreadPoolExecutor对象,注意的是整个JDK实现的线程池关键的一个类就是ThreadPoolExecutor,包括调度线程池最终也是初始化的ThreadPoolExecutor对象。那我们来看看ThreadPoolExecutor这个关键的类的构造方法都做了什么事情:

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

     由上面的构造方法来看,先是对关键参数做了检查,满足条件之后实际就是将客户端传入的参数或者相关默认参数初始化成ThreadPoolExecutor对象返回给客户端。

初始化一个线程池有几项比较关键的参数

 

属性 含义
corePoolSize 线程池的最小大小,也就是初始化大小。
maximumPoolSize 线程池的最大大小,对于当前线程池处理的任务超过此数目,则任务只能等待有其他工作线程释放之后才能继续处理新的提交任务。

workQueue

工作队列,当客户端向线程池提交的任务数量大于核心线程池大小时会先存入此队列中。

如果客户端向线程池提交的任务数量小于核心数量,则不会向队列中添加,而是直接启动一个新的线程执行提交的任务。

threadFactory 线程工厂。顾名思义就是创建线程的工厂对象,使用者可以自定义自己的线程工厂,不指定则使用JDK默认的线程工厂。第二步,提交工作线程


第二步,提交工作线程

  service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("executor");
            }
        });

    执行上述代码为什么会执行run()方法呢?下面来分析下server.execute()方法。

  1.  比较当前工作的worker线程是否小于核心/最小线程池大小,这里是我们代码中指定的10,如果小于则添加到Worker线程池工作任务数组中,并直接诶开启新的线程执行任务。
  2. 如果提交的任务数量大于核心线程池大小,这个时候工作队列就派上用处了,会把提交的任务提交的工作队列中,等待空闲线程去工作队列中去任务执行。

  3. 如果加入工作队列失败,则尝试添加到Worker线程组中,并启动新的线程执行任务。如果当前线程超过了最大线程池大小,则会拒绝此任务的执行,任务执行失败。

 总体来看,java线程池的实现很大一部分就是依赖的工作阻塞队列(BlockingQueue),默认的工作队列有

 LinkedBlockingQueue  SynchronousQueue 等多种。线程池能够做到线程的高度复用实际也是依赖阻塞队列优秀的阻塞、唤醒机制。

下面我们来分析阻塞队列的实现机制。

分享到:
评论

相关推荐

    Java线程池浅析1

    }关于FutureTask这个类的实现,我在前面的JAVA LOCK代码浅析有讲过其实现原理,主要的思想就是关注任务完成与未完成的状态,任务提交线程get()结

    java nio 原理浅析

    Java NIO(非阻塞I/O)是一种在Java中实现高效I/O操作的方式,相比于传统的BIO(阻塞I/O),NIO具有更...虽然本文没有深入到Netty的源码层面,但对于理解Netty的工作原理和如何利用它来构建高性能的网络应用已经足够。

    Netty实现原理浅析.pdf

    ### Netty实现原理浅析 #### 一、总体结构概览 Netty是一个高性能的Java NIO框架,由JBoss出品。它不仅提供了一套完整的客户端和服务端开发工具集,而且具备高度可定制化的特点,使得开发者能够轻松构建出可靠且...

    Netty实现原理浅析

    ### Netty实现原理浅析 #### 一、总体结构 Netty是一款由JBoss推出的高效且功能丰富的Java NIO框架,旨在简化网络编程并提高性能。为了更好地理解Netty的工作原理,我们首先需要了解它的整体架构。Netty的总体结构...

    Netty实现原理浅析.docx

    总的来说,Netty 的实现原理涵盖了网络I/O模型、事件驱动机制、线程池管理以及高效的数据缓冲技术。这些设计使得Netty成为了Java平台上的首选网络编程框架之一,广泛应用于高并发、低延迟的系统,如分布式计算、实时...

    基于Java的web服务器课程设计

    另一份文件"浅析基于Java的Web服务器工作原理-学院-黑客基地.mht"可能是一个技术性的文章,它可能深入讲解了Java web服务器的核心工作原理。这类文章通常会讨论如下的知识点: 1. **线程管理**:由于web服务器需要...

    Java多线程文章系列.pdf

    #### 十二、JAVA的多线程浅析 ##### 1. JAVA语言的来源、及特点 - **起源**: - Java最初由Sun Microsystems开发。 - **特点**: - 面向对象。 - 平台无关性。 - 自动垃圾回收。 ##### 2. JAVA的多线程理论 - **...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载4.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载2.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载3.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载1.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    安卓Android源码——防止内存溢出浅析.zip

    Android系统使用Java虚拟机(Dalvik或ART)进行内存分配和管理,但如果不妥善处理,很容易引发内存溢出(Out Of Memory,简称OOM)。本篇文章将深入浅析Android源码中的内存管理机制,以及如何预防和处理内存溢出...

    学习笔记

    理解JVM的工作原理,包括内存模型、类加载机制、垃圾回收等,对于优化Java应用程序性能至关重要。 3. **固定SessionID漏洞** 在Web开发中,SessionID用于跟踪用户状态。固定SessionID可能引发安全问题,如会话劫持...

Global site tag (gtag.js) - Google Analytics