返回顶部
首页 > 资讯 > 后端开发 > Python >java线程池中线程数量到底是几
  • 181
分享到

java线程池中线程数量到底是几

java 线程数量java线程池数量 2022-11-13 13:11:38 181人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录线程池配置线程池里的业务线程数量小于最小数量(5)第一个请求第二个请求第三个请求第五个请求小于阻塞队列容量(10)第六个请求第七个请求第15个请求小于最大数量(20)第16个请求

线程池配置

线程池配置,假设是:

1.最小数量是5

2.阻塞队列容量是10

3.最大数量是20

线程池里的业务线程数量小于最小数量(5)

第一个请求

第一个请求进来的时候,这个时候,线程池没有线程,就创建新的工作线程(即Worker线程)。

然后,这个工作线程去处理当前请求的业务线程。

第二个请求

第二个请求进来的时候,这个时候,线程池已经有了一个工作线程。

但是,要注意,这个时候是不会复用线程池里已有的工作线程的。而是创建新的工作线程。

因为,线程池里根本没有复用线程的概念。

说白了,无论线程池里已有的这个工作线程是否在处理业务线程,即不管它空闲与否,其实都会创建新的工作线程。

第三个请求

同上,仍然创建新的工作线程。

。。。

第五个请求

同上。仍然创建新的工作线程。

注意,现在,线程池有几个工作线程?5个。

即,每个请求进来,都创建一个新的工作线程。

小于阻塞队列容量(10)

第六个请求

第六个请求进来的时候,提交到阻塞队列。

然后,再慢慢消费。

具体来说,是由线程池里的工作线程来慢慢消费。

具体消费的源码,参考:复用线程小节。

第七个请求

同上,也是先添加到阻塞队列。

。。。

第15个请求

同上,也是先添加到阻塞队列。

小于最大数量(20)

第16个请求

先来看,正常情况下,阻塞队列还没塞满(生产环境的容量一般是1000),就会被快速处理掉。

然后,当新的请求进来的时候,继续丢到阻塞队列里面去。

这个是和上面讲的一样。

但是,我们为了方便理解,现在假设之前的15个请求是同时到达,即

  • 前面5个请求

创建5个新的请求。

  • 后面10个请求

全部丢到阻塞队列。

这个时候,阻塞队列已经满了。接着,第16个请求进来了,怎么办?

继续创建新的工作线程。

。。。

第35个请求

同上,继续创建新的工作线程。

注意,这个时候,线程池里的工作线程的数量是多少?20。

因为

  • 前面5个请求,创建了5个新的工作线程。
  • 最后面的15个请求(第16到第35),创建了15个新的工作线程。

所以,总共,创建了20个新的工作线程。线程池,总共有20个工作线程。

拒绝策略

第36个请求

假设前面的请求都没有处理完,这个时候,来了第36个请求,怎么办?

只能采取拒绝策略。

具体采用哪个拒绝策略?比如说,一般情况下,都是采用丢弃。

复用线程

前面说了,线程池里没有复用线程的概念。

那到底是怎么回事呢?既然不能复用线程,那搞个线程池有个几把用?

具体是这样子,虽然,线程池里的工作线程不能被复用,仅仅是指类似数据库连接池里的连接的那种复用,即

  • 用的时候,从连接池取
  • 用完了,归还到连接池

线程池里的对象复用,是基于循环,而不是用完之后再还回去。

什么意思呢?就是工作线程,不断的从阻塞队列里取业务线程,然后执行业务线程。

伪代码

工作线程{
  run(){
    while(){
      1.从阻塞队列,取业务线程
      2.执行业务线程;
    }
  }
}

所以,线程池和连接池的区别在于,线程池的对象是线程,可以不断的循环读业务线程。而连接池的对象,是用完了归还到连接池里去。

jdk源码-java.util.concurrent.ThreadPoolExecutor#runWorker


    final void runWorker(Worker w) {
        Thread wt = Thread.currentThread();
        Runnable task = w.firstTask;
        w.firstTask = null;
        w.unlock(); // allow interrupts
        boolean completedAbruptly = true;
        try {
            //从阻塞队列里获取业务线程
            while (task != null || (task = getTask()) != null) {
                w.lock();
                // If pool is stopping, ensure thread is interrupted;
                // if not, ensure thread is not interrupted.  This
                // requires a recheck in second case to deal with
                // shutdownNow race while clearing interrupt
                if ((runStateAtLeast(ctl.get(), STOP) ||
                     (Thread.interrupted() &&
                      runStateAtLeast(ctl.get(), STOP))) &&
                    !wt.isInterrupted())
                    wt.interrupt();
                try {
                    beforeExecute(wt, task);
                    Throwable thrown = null;
                    try {
                        //执行业务线程
                        task.run();
                    } catch (RuntimeException x) {
                        thrown = x; throw x;
                    } catch (Error x) {
                        thrown = x; throw x;
                    } catch (Throwable x) {
                        thrown = x; throw new Error(x);
                    } finally {
                        afterExecute(task, thrown);
                    }
                } finally {
                    task = null;
                    w.completedTasks++;
                    w.unlock();
                }
            }
            completedAbruptly = false;
        } finally {
            processWorkerExit(w, completedAbruptly);
        }
    }

到此这篇关于java线程池中线程数量到底是几的文章就介绍到这了,更多相关java 线程数量内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: java线程池中线程数量到底是几

本文链接: https://lsjlt.com/news/171360.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java线程池中线程数量到底是几
    目录线程池配置线程池里的业务线程数量小于最小数量(5)第一个请求第二个请求第三个请求第五个请求小于阻塞队列容量(10)第六个请求第七个请求第15个请求小于最大数量(20)第16个请求...
    99+
    2022-11-13
    java 线程数量 java线程池数量
  • JAVA怎么控制线程池的线程数量
    Java中可以通过使用`ThreadPoolExecutor`类来控制线程池的线程数量。`ThreadPoolExecutor`提供...
    99+
    2023-10-11
    JAVA
  • 如何查看java线程池的线程数量
    要查看Java线程池的线程数量,可以使用`getPoolSize()`方法来获取线程池中当前的线程数量。以下是一个示例代码:```j...
    99+
    2023-08-24
    java
  • 一文彻底搞懂java多线程和线程池
    目录 什么是线程 一. Java实现线程的三种方式1.1、继承Thread类1.2、实现Runnable接口,并覆写run方法二. Callable接口...
    99+
    2024-04-02
  • java中什么是线程池
    本篇文章为大家展示了java中什么是线程池,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. ...
    99+
    2023-06-14
  • 什么是java线程池
    使用线程池的好处有很多,比如节省系统资源的开销,节省创建和销毁线程的时间等,当我们需要处理的任务较多时,就可以使用线程池,可能还有很多用户不知道Java线程池如何使用?今天给大家分享Java四种线程池的使用方法。线程池介绍:线程池是一种多线...
    99+
    2017-06-28
    java入门 java 线程池
  • java线程池是什么
    java的线程池是什么,有哪些类型,作用分别是什么 (推荐学习:java课程)线程池是一种多线程处理形式,处理过程中将任务添加队列,然后在创建线程后自动启动这些任务,每个线程都使用默认的堆栈大小,以默认的优先级运行,并处...
    99+
    2016-06-22
    java教程 java
  • 一文彻底了解Android中的线程和线程池
    目录前言1.主线程和子线程2.Android中的线程形态2.1 AsyncTask2.2 AsyncTask的工作原理2.3 HandleThread2.4 IntentServic...
    99+
    2022-12-20
    Android 线程池 android线程机制 线程和线程池
  • python自定义线程池控制线程数量
    1.自定义线程池 import threading import Queue import time queue = Queue.Queue() def put_data_in_queue(): for i in xrang...
    99+
    2023-01-31
    线程 自定义 数量
  • java怎么停止线程池中的线程
    要停止线程池中的线程,可以使用 `ExecutorService` 接口提供的 `shutdown()` 方法来停止线程池。这个方法...
    99+
    2023-08-20
    java
  • SpringBoot线程池和Java线程池怎么使用
    这篇文章主要介绍“SpringBoot线程池和Java线程池怎么使用”,在日常操作中,相信很多人在SpringBoot线程池和Java线程池怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringB...
    99+
    2023-07-06
  • Java多线程案例之线程池
    文章目录 一. 线程池概述1. 什么是线程池2. Java标准库提供的线程池 二. 线程池的简单实现 一. 线程池概述 1. 什么是线程池 线程池和和字符串常量池, 数据库连接池一样,...
    99+
    2023-09-04
    java 线程池 多线程
  • Java线程池中多余的线程是如何回收的
    最近阅读了JDK线程池ThreadPoolExecutor的源码,对线程池执行任务的流程有了大体了解,实际上这个流程也十分通俗易懂,就不再赘述了,别人写的比我好多了。 不过,我倒是对...
    99+
    2024-04-02
  • Java手写线程池之向JDK线程池进发
    目录前言JDK线程池一瞥自己动手实现线程池线程池参数介绍实现Runnable实现Callable拒绝策略的实现线程池关闭实现工作线程的工作实现线程池实现的BUG完整代码线程池测试总结...
    99+
    2022-11-13
    Java手写线程池 Java线程池
  • Java线程池架构中的多线程调度器是什么
    本篇文章为大家展示了Java线程池架构中的多线程调度器是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我们如果要用java默认的线程池来做调度器,一种选择就是Timer和TimerTask的结合...
    99+
    2023-06-17
  • Java多线程之线程池七个参数详解
    目录corePoolSize:核心线程数maximumPoolSize:最大线程数keepAliveTime:空闲线程存活时间unit:时间单位workQueue:工作队列threa...
    99+
    2024-04-02
  • java怎么从线程池获取线程
    在 Java 中,可以使用 `ExecutorService` 接口来管理线程池,并从线程池中获取线程。下面是通过线程池获取线程的一...
    99+
    2023-10-11
    java
  • 图文详解Java线程和线程池
    目录一、什么是线程,线程和进程的区别是什么二、线程中的基本概念,线程的生命周期三、单线程和多线程四,线程池的原理解析五,常见的几种线程池的特点以及各自的应用场景总结一、什么是线程,线...
    99+
    2024-04-02
  • 【Java | 多线程案例】——初识线程池
    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在...
    99+
    2024-01-21
    java 线程池
  • java线程池详解
    线程池概述 线程池就是一个管理线程的池子,可以降低创建和销毁线程带来的资源消耗因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走GC垃圾回收流程,都是需要资源开销的。 提高响应速度,任务到达了相对于从线程池取线...
    99+
    2015-04-06
    java基础 线程池 java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作