美文网首页
Java中的线程池

Java中的线程池

作者: kidawinterII | 来源:发表于2021-09-04 19:01 被阅读0次

Java提供的线程池出自并发大师Doug Lea之手,向大师致敬!

1. 为什么要用线程池

合理使用线程池可以带来3个好处:

  • 降低资源消耗。重复利用已经创建的线程,避免线程重复创建带来的消耗。
  • 提高响应速度。当任务到达时,任务不必等线程创建即可立即执行。
  • 提高线程的可管理性。使用线程池可以对线程统一分配、调优和监控。
    总之,线程池是为了资源复用、提高效率、方便管理的产物。“池”的作用有两点:一是复用已有资源,二是控制资源总量

2. 线程池的原理

当向线程池提交了一个任务之后,线程池是如何处理这个任务的呢?

  • 首先线程池判断核心线程池的线程是否都在执行任务,如果不是泽创建一个线程执行任务,否则就如下一个流程。
  • 线程池判断任务队列是否已经满了,如果没有满则将任务存储在工作队列里面,如果满了则进入下一个流程。
  • 线程池判断线程是否都已经处于工作状态,如果没有则创建一个线程执行任务,如果已经满了则交给策略处理无法完成的任务。


    线程池任务处理流程
    ThreadPoolExecutor执行示意图

3. 线程池的使用

通过ThreadPoolExecutor来创建一个线程池:

new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, unit, queue)

创建完成后通过ThreadPoolExecutor的execute(sumbmit最终也是调用execute执行任务)方法向线程池提交任务,代码如下:

public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        int c = ctl.get();
        if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            if (! isRunning(recheck) && remove(command))
                reject(command);
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        else if (!addWorker(command, false))
            reject(command);
    }
  • execute方法首先判断当前运行线程少于corePoolSize,则创建新线程任务来执行任务
  • 如果运行线程等于或多于corePoolSize,则将任务加入到队列
  • 如果无法将任务加入到队列,则创建新线程执行任务
  • 创建新线程时如果数量超过maxPoolSize则拒绝执行任务,这里需要注意一下如果构造ThreadPoolExecutor传入的是无界队列,maxPoolSize无效,最大线程数将是corePoolSize

相关文章

  • 19. 线程池

    Android 中的线程池就是 java 中的线程池,即 ThreadPoolExecutor 类。 Java 通...

  • Android 线程池的封装

    GlobalThreadPools.java: 调用: 线程池线程池概念来源于Java中的Executor,它是一...

  • Java线程池总结

    本篇文章讲述Java中的线程池问题,同样适用于Android中的线程池使用。本篇文章参考:Java线程池分析,Ja...

  • Java线程池详解

    本篇文章讲述Java中的线程池问题,同样适用于Android中的线程池使用。本篇文章参考:Java线程池分析,Ja...

  • Java线程池解析

    参考文章:Java并发:线程池,饱和策略 前言 Java线程池的使用在工作中还是比较常见的,线程池可以减小线程建立...

  • ThreadPoolExecutor的用法

    Java中的线程池 一般我们说起Java中的线程池,其实指的是java.util.concurrent包下的Thr...

  • Android中线程池的使用分析

    引言:说起线程池,学习过Java基础的同学估计都不陌生,Android中的线程池其实就是java的线程池。那么为什...

  • Java多线程之线程池深入讲解

    1 线程池介绍 1.1 线程池概念 Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Jav...

  • Java并发

    一、线程池 线程池:事先将多个线程放到容器中,用的时候不用New线程,直接从池中获取。 Java中的线程池有: 1...

  • 分析jdk-1.8-ForkJoinPool实现原理(上)

    Java并发编程源码分析系列: 分析Java线程池的创建 分析Java线程池执行原理 分析Java线程池Calla...

网友评论

      本文标题:Java中的线程池

      本文链接:https://www.haomeiwen.com/subject/whurwltx.html