美文网首页
线程池处理流程分析

线程池处理流程分析

作者: tomorrowsg | 来源:发表于2020-10-30 22:38 被阅读0次
image.png

上述是线程池处理任务的流程,相信大家都在网上搜到不少,今天咱们来用代码验证一下,亲自看看这个流程是不是这样的

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.*;


@Slf4j
public class Test {

    private static ExecutorService service;
    public static ObjectMapper objectMapper = new ObjectMapper();

    static {
        ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();
        //核心线程2个,最大线程4个,存活时间20秒,队列最大长度为2,
        service = new ThreadPoolExecutor(2, 4, 20, TimeUnit.SECONDS, new ArrayBlockingQueue<>(2), threadFactory);
    }

    public static void main(String[] args) throws JsonProcessingException, InterruptedException {

        for (int i = 0; i < 5; i++) {
            //每次等待50毫秒,确保前一个任务可以提交
            TimeUnit.MILLISECONDS.sleep(50);
            int finalI = i;
            service.execute(() -> {
                try {
                    //打印当前执行任务的线程名字和任务id
                    log.info(finalI + "-----" + Thread.currentThread().getName() + "-------before");
                    TimeUnit.SECONDS.sleep(10);
                    log.info(finalI + "-----" + Thread.currentThread().getName() + "-------after");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
    }
}

上述代码打印结果如下:

2020-10-30 22:07:36.051 INFO [demo-pool-0]com.tomorrowsg.test.test.Test.lambdamain0:40 -0-----demo-pool-0-------before
2020-10-30 22:07:36.100 INFO [demo-pool-1]com.tomorrowsg.test.test.Test.lambdamain0:40 -1-----demo-pool-1-------before
2020-10-30 22:07:36.252 INFO [demo-pool-2]com.tomorrowsg.test.test.Test.lambdamain0:40 -4-----demo-pool-2-------before
2020-10-30 22:07:46.055 INFO [demo-pool-0]com.tomorrowsg.test.test.Test.lambdamain0:42 -0-----demo-pool-0-------after
2020-10-30 22:07:46.056 INFO [demo-pool-0]com.tomorrowsg.test.test.Test.lambdamain0:40 -2-----demo-pool-0-------before
2020-10-30 22:07:46.101 INFO [demo-pool-1]com.tomorrowsg.test.test.Test.lambdamain0:42 -1-----demo-pool-1-------after
2020-10-30 22:07:46.101 INFO [demo-pool-1]com.tomorrowsg.test.test.Test.lambdamain0:40 -3-----demo-pool-1-------before
2020-10-30 22:07:46.252 INFO [demo-pool-2]com.tomorrowsg.test.test.Test.lambdamain0:42 -4-----demo-pool-2-------after
2020-10-30 22:07:56.058 INFO [demo-pool-0]com.tomorrowsg.test.test.Test.lambdamain0:42 -2-----demo-pool-0-------after
2020-10-30 22:07:56.102 INFO [demo-pool-1]com.tomorrowsg.test.test.Test.lambdamain0:42 -3-----demo-pool-1-------after

从上面可以看出,
线程池两个核心线程(demo-pool-0、demo-pool-1)先执行0、1两个任务,然后将2、3两个任务添加到队列中,由于队列满了,所以又创建了一个非核心线程(demo-pool-2)处理任务4,等两个核心线程执行结束后又执行任务2和3。

相关文章

  • 线程池处理流程分析

    上述是线程池处理任务的流程,相信大家都在网上搜到不少,今天咱们来用代码验证一下,亲自看看这个流程是不是这样的 上述...

  • 线程池的工作流程理解与项目中实战

    线程池主要处理流程 1.线程池判断核心线程是否已经满了,否 则会创建线程执行任务,是 进入下一个流程2.线程池判断...

  • Java线程池的实现原理

    线程池的实现原理 当向线程池提交一个任务之后,线程池时如何处理的呢?让我们来看一下线程池的主要处理流程: 线程池判...

  • 第九章 线程池

    线程池的实现原理和使用建议。 当提交一个新任务到线程池时,线程池的处理流程如下。1)线程池判断核心线程池里的线程是...

  • Java核心(二)深入理解线程池ThreadPool

    本文你将获得以下信息: 线程池源码解读 线程池执行流程分析 带返回值的线程池实现 延迟线程池实现 为了方便读者理解...

  • Java高并发系列——检视阅读(三)

    JAVA线程池 线程池实现原理 类似于一个工厂的运作。 当向线程池提交一个任务之后,线程池的处理流程如下: 判断是...

  • 线程池的处理流程和原理

    线程池的处理流程主要分为3步 提交任务后,线程池先判断线程数是否达到了核心线程数(corePoolSize)。如果...

  • 线程池的实现原理

    当提交一个新任务到线程池时,线程池的处理流程如下: 1. 线程池判断核心线程池里的线程是否都在执行任务。如果不是,...

  • 线程池的实现原理

    当提交一个新的任务到线程池时,线程池的处理流程: 1、线程池判断核心线程池里的线程是否都在执行任务,如果不是,则创...

  • 线程池源码-任务执行

    在上一篇文章 线程池源码-任务提交 中,我主要讲解了: 线程池初始化参数 线程池处理任务的整体流程 worker ...

网友评论

      本文标题:线程池处理流程分析

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