【业务功能篇91】微服务-springcloud-多线程-线程池执行顺序

这篇具有很好参考价值的文章主要介绍了【业务功能篇91】微服务-springcloud-多线程-线程池执行顺序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、线程的实现方式

1. 线程的实现方式

1.1 继承Thread

class ThreadDemo01 extends Thread{
    @Override
    public void run() {
        System.out.println("当前线程:" + Thread.currentThread().getName());
    }
}

1.2 实现Runnable接口

class ThreadDemo02 implements Runnable{
    @Override
    public void run() {
        System.out.println("当前线程:" + Thread.currentThread().getName());
    }
}

1.3 Callable接口

class MyCallable implements Callable<Integer>{
    @Override
    public Integer call() throws Exception {
        System.out.println("当前线程:" + Thread.currentThread().getName());
        return 10;
    }
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("main方法执行了...");
        ThreadDemo01 t1 = new ThreadDemo01();
        t1.start();

        ThreadDemo02 t2 = new ThreadDemo02();
        new Thread(t2).start();
        new Thread(()->{
            System.out.println("当前线程:" + Thread.currentThread().getName());
        }).start();

        // 通过Callable接口来实现  FutureTask 本质上是一个Runnable接口
        FutureTask futureTask = new FutureTask(new MyCallable());
        Thread t3 = new Thread(futureTask);
        t3.start();
        // 阻塞等待子线程的执行完成,然后获取线程的返回结果
        Object o = futureTask.get();
        System.out.println("o = " + o);
        System.out.println("main方法结束了...");
    }

2.线程池的实现

  上面的三种获取线程的方法是直接获取,没有对线程做相关的管理,这时可以通过线程池来更加高效的管理线程对象。

// 定义一个线程池对象
    private static ExecutorService service = Executors.newFixedThreadPool(5);

然后我们就可以通过这个线程池对象来获取对应的线程

        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程池--》当前线程:" + Thread.currentThread().getName());
            }
        });

3. 获取线程的区别

  通过上面的介绍我们发现获取线程的方式

  • 继承Thread对象
  • 实现Runnable接口
  • 实现Callable接口
  • 线程池

继承Thread对象和实现Runnable接口没有办法获取返回结果的,实现Callable接口可以获取线程的返回结果。当然这三种方式都不能控制我们的资源,线程池可以控制资源。

二、线程池的详解

1.线程池的创建方式

  • 通过Executors的静态方法
  • 通过 new ThreadPoolExecutor方式创建

七大参数的作用

参数 作用
corePoolSize 核心线程数,线程池创建好后就准备就绪的线程数量,一直存在
maximumPoolSize 最大线程数量,控制资源
keepAliveTime 存活时间,如果当前线程数量如果大于核心线程数量,释放空闲的线程,<br />最大线程-核心数量
unit 时间单位
BlockingQueue 阻塞队列,如果任务很多,就会把多的任务放在队列中
threadFactory 线程的工厂
handler 如果队列满了,按照指定的拒绝策略执行任务
    /**
     * 线程池详解
     * @param args
     */
    public static void main(String[] args) {
        // 第一种获取的方式
        ExecutorService service = Executors.newFixedThreadPool(10);
        // 第二种方式: 直接new ThreadPoolExecutor()对象,并且手动的指定对应的参数
        // corePoolSize:线程池的核心线程数量 线程池创建出来后就会 new Thread() 5个
        // maximumPoolSize:最大的线程数量,线程池支持的最大的线程数
        // keepAliveTime:存活时间,当线程数大于核心线程,空闲的线程的存活时间 8-5=3
        // unit:存活时间的单位
        // BlockingQueue<Runnable> workQueue:阻塞队列 当线程数超过了核心线程数据,那么新的请求到来的时候会加入到阻塞的队列中
        // new LinkedBlockingQueue<>() 默认队列的长度是 Integer.MAX 那这个就太大了,所以我们需要指定队列的长度
        // threadFactory:创建线程的工厂对象
        // RejectedExecutionHandler handler:当线程数大于最大线程数的时候会执行的淘汰策略
        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5
                , 100
                , 10
                , TimeUnit.SECONDS
                , new LinkedBlockingQueue<>(10000)
                , Executors.defaultThreadFactory()
                , new ThreadPoolExecutor.AbortPolicy()
        );
        poolExecutor.execute(()->{
            System.out.println("----->" + Thread.currentThread().getName());
        });
    }

2.线程池的执行顺序

线程池创建,准备好core数量的核心线程,准备接收任务

【业务功能篇91】微服务-springcloud-多线程-线程池执行顺序,Spring cloud,Spring boot,Java,spring cloud,微服务,多线程,线程池执行顺序

  • 1.先判断核心线程是否已满,未满分配线程
  • 2.任务队列是否已满,未满放入队列
  • 3.是否达到最大的线程数量,未达到创建新的线程
  • 4.通过对应的reject指定的拒绝策略进行处理

线程池的面试题:

  • 有一个线程池,core:5,max:50,queue:100,如果并发是200,那么线程池是怎么处理的?
  • 首先 200个中的前面5个会直接被核心线程处理,然后6个到105个会加入到阻塞队列中,然后106到155的请求在最大线程数中,那么会创建对应的线程来处理这些请求,之后剩下的45个请求会被直接放弃

【业务功能篇91】微服务-springcloud-多线程-线程池执行顺序,Spring cloud,Spring boot,Java,spring cloud,微服务,多线程,线程池执行顺序文章来源地址https://www.toymoban.com/news/detail-694663.html

3.线程池的好处

  • 降低资源消耗
  • 提高响应速度
  • 提高线程的管理

到了这里,关于【业务功能篇91】微服务-springcloud-多线程-线程池执行顺序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【业务功能篇104】 补充【业务功能篇99】微服务-springcloud-springboot-电商订单模块--整合支付

    在前面我们业务功能篇98-99中,我们介绍了电商项目中的订单模块服务,那么最后就是需要进行支付动作,那么我们这里就通过订阅第三方平台支付宝的支付调用接口功能,来进一步完成订单提交后的支付动作,支付宝的接口使用可以登录官网开发指南详情去了解 在我们对应

    2024年02月09日
    浏览(38)
  • 【业务功能100】补充代码【业务功能88】微服务-springcloud-分布式锁-redis-redisson-springcache

    采用redisson做分布式锁,完成数据的查询接口功能getCatelog2JSONRedis 原先从mysql数据库查询的效率较低,现在将部分固定数据展示比如页面的树形栏目信息等,存储到 redis缓存 ,然后基于分布式集群,需要结合本地锁(synchronized )与分布式锁(redissonClient.getLock(“catelog2JSON-lock”

    2024年02月09日
    浏览(32)
  • 【业务功能篇85】微服务-springcloud-Nginx-反向代理-网关

    Nginx域名 在c:/window/system32/drivers/etc/hosts文件,我们在这个文件中添加 注意如果是没有操作权限,那么点击该文件右击属性,去掉只读属性即可 通过这个域名访问到Nginx服务 nginx.cof是全局配置文件 /mydata/nginx/conf/nginx.cof 文件中最后配置了一个信息 include /etc/nginx/conf.d/*.conf 表示

    2024年02月10日
    浏览(49)
  • 【业务功能篇90】微服务-springcloud-检索服务-ElasticSearch实战运用-DSL语句

      商品检索页面我们放在search服务中处理,首页我们需要在mall-search服务中支持Thymeleaf。添加对应的依赖 然后我们拷贝模板文件到template目录下,然后不要忘记添加Thymeleaf的名称空间 需要把相关的静态资源文件拷贝到Nginx服务中。目录结构是:/mydata/nginx/html/static/search/ 我们

    2024年02月10日
    浏览(42)
  • 【业务功能109】微服务-springcloud-springboot-Skywalking-链路追踪-监控

    skywalking 是一个apm系统,包含监控,追踪,并拥有故障诊断能力的 分布式 系统   Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin /Pinpoint /CAT 的设计思路。特点是:支持多种插件,UI功能较强,支持非侵入式埋点。目前使用厂商最多,版

    2024年02月08日
    浏览(44)
  • 【业务功能篇94】微服务-springcloud-springboot-认证服务-注册功能-第三方短信验证API

      结合我们前面介绍的商城的架构我们需要单独的搭建一个认证服务。   首先创建一个SpringBoot项目,然后添加对应的依赖   我们需要把认证服务注册到Nacos中,添加对应的依赖,然后完成对应的配置 放开Nacos注册中心 然后启动测试   然后我们整理登录和注册的相关

    2024年02月09日
    浏览(38)
  • 【业务功能篇99】微服务-springcloud-springboot-电商订单模块-生成订单服务-锁定库存

    一个是需要生成订单信息一个是需要生成订单项信息。具体的核心代码为 锁定库存的操作,需要操作ware仓储服务。 没有库存或者锁定库存失败我们通过自定义的异常抛出 如果下订单操作成功(订单数据和订单项数据)我们就会操作锁库存的行为 锁定库存失败通过抛异常来

    2024年02月09日
    浏览(34)
  • 【业务功能篇84】微服务SpringCloud-ElasticSearch-Kibanan-电商实例应用

    ElasticSearch实现商城系统中全文检索的流程。 商品的映射关系 如上的例子,netsted类型,避免了我们properties属性里的三个字段值同类型,他们的内容不会错乱匹配 参考官网地址:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/nested.html 3.1 创建ESModel 点击上架功能传递spuId到后台

    2024年02月10日
    浏览(44)
  • 【业务功能篇81】微服务SpringCloud-ElasticSearch-Kibanan-docker安装-入门实战

      ES 是一个开源的 高扩展的分布式全文搜索引擎 ,是整个Elastic Stack技术栈的核心。它可以近乎实时的存储,检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。   ElasticSearch的底层是开源库Lucene,但是你没办法直接用Lucene,必须自己写代码去调用

    2024年02月02日
    浏览(36)
  • 【业务功能篇82】微服务SpringCloud-ElasticSearch-Kibanan-docke安装-进阶实战

    https://www.elastic.co/guide/en/elasticsearch/reference/7.4/getting-started-search.html 在ElasticSearch中支持两种检索方式 通过使用REST request URL 发送检索参数(uri+检索参数) 通过使用 REST request body 来发送检索参数 (uri+请求体) 第一种方式 GET bank/_search # 检索bank下的所有信息,包括 type 和 docs GET ba

    2024年02月11日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包