Java Web 实战 10 - 多线程基础之线程池

这篇具有很好参考价值的文章主要介绍了Java Web 实战 10 - 多线程基础之线程池。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好 , 这篇文章给大家带来的是多线程当中的线程池 , 使用线程池可以降低资源消耗 , 通过重复利用已创建的线程降低线程创建和销毁造成的消耗 . 还可以提高响应速度 , 当任务到达时,任务可以不需要等到线程创建就能立即执行
我们会从三个角度分析线程池

  1. 线程池是什么
  2. 标准库中的线程池
  3. 我们自己实现一个线程池

推荐大家跳转到此链接查看文章体验效果更好嗷~
上一篇文章的链接我也给大家贴在这里了
Java Web 实战 10 - 多线程基础之线程池

8.4 线程池

对于 “池” 这个字 , 我们学习过 : “字符串常量池” “数据库连接池” “备胎池”

“备胎池” : 养了许多的备胎 , 这个分了那个就无缝连接 , 提高了效率

进程已经能做到并发编程了 , 为什么还需要线程 ?
进程实在是太重量了 , 创建和销毁成本都比较高 , 需要申请释放资源
线程就是针对上述问题的优化 , 因为他是共用同一组系统资源的 , 一旦资源申请好了 , 后续就不需要再继续申请了

虽然线程已经很好了 , 不过在更高频率下的创建释放的情况下 , 线程也就扛不住了
所以还需要进一步优化 :

  1. 线程池
  2. 协程 (也叫做纤程) , 更加轻量级的线程

我们主要研究一下线程池 :
线程池解决的思路就是把线程创建好之后 , 放到池子中 , 而不是通过系统来销毁
当线程用完了 , 还是还回到池子中 , 而不是通过系统来进行销毁
上述操作 , 就又进一步的提高效率了

❗ 那为什么把线程放到池子里 , 然后从池子中取出线程就要比从系统中创建线程来得快呢 ?
✅ 从池子中取 , 是纯用户态操作 . 通过系统来创建 , 涉及到内核态操作
通常认为 , 牵扯到内核态的操作1 , 就是要比纯用户态的操作更低效

为什么说用户态操作比内核态操作更高效呢 ?
举个栗子 :
image.png

1. 标准库中的线程池

image.png
刚才是创建的固定个数的线程池
我们还可以创建线程数量动态增加的线程池

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Demo24 {
    public static void main(String[] args) {
        // ExecutorService 叫做执行器服务
        // Executors.newFixedThreadPool() 创建固定线程个数的线程池
        // Executors 是静态方法
        // Executors通过.的方式调用静态方法

        // 固定个数的线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(10);

        // 线程数量动态增加的线程池
        // Executors.newCachedThreadPool();
        
        
    }
}

学习完怎样创建之后 , 我们接下来就可以使用线程池了

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Demo24 {
    public static void main(String[] args) {
        // ExecutorService 叫做执行器服务
        // Executors.newFixedThreadPool() 创建固定线程个数的线程池
        // Executors 是静态方法
        // Executors 通过.的方式调用静态方法

        // 固定个数的线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(10);

        // 线程数量动态增加的线程池
        // Executors.newCachedThreadPool();

        // 把任务加入到线程池中
        // 与定时器类似,线程池内部也有线程阻止退出,我们需要手动关闭
        threadPool.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello 线程池");
            }
        });
    }
}

2. 自己实现简单的线程池

阻塞队列来保存一些任务 , submit 方法给线程池添加任务 , 线程池内部再持有一些线程来消费执行这里的任务
线程池就相当于一个简单的生产者-消费者模型

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

class MyThreadPool {
    // 由于插入任务可以一次性插入很多.需要能够把当前尚未执行的任务都保存起来 -> 队列
    // 这个队列就是一个任务队列,把当前线程池中要完成的内容都放到这个队列里
    // 再由线程池内部的工作线程负责完成他们
    private BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();

    // 核心方法:往线程池中插入任务
    public void submit(Runnable runnable) {
        try {
            queue.put(runnable);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    // 构造方法中,就需要创建一些线程,让这些线程负责完成上述执行任务的工作
    public MyThreadPool(int n) {
        for (int i = 0; i < n; i++) {
            Thread t = new Thread(() -> {
                // 直接写成 true 就写死了,也别让他一直循环
                // 我们可以改成 !Thread.currentThread().isInterrupted()
                // 作用
                // 1. 判断标志位
                // 2. 处理异常
                while(!Thread.currentThread().isInterrupted()) {
                    try {
                        Runnable runnable = queue.take();
                        runnable.run();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        break;// 直接处理
                    }
                }
            });
            t.start();
        }
    }
}

public class Demo25 {
    public static void main(String[] args) {
        MyThreadPool myThreadPool = new MyThreadPool(10);
        for (int i = 0; i < 100; i++) {
            myThreadPool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello");
                }
            });
        }
    }
}

到这里 , 多线程基础部分就已经结束了
如果对你有帮助的话 , 请一键三连嗷~
Java Web 实战 10 - 多线程基础之线程池文章来源地址https://www.toymoban.com/news/detail-405187.html

到了这里,关于Java Web 实战 10 - 多线程基础之线程池的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!

    在Java中,创建线程是一项非常重要的任务。线程是一种轻量级的子进程,可以并行执行,使得程序的执行效率得到提高。Java提供了多种方式来创建线程,但许多人都认为Java有三种创建线程的方式,它们分别是 继承Thread类、实现Runnable接口和使用线程池。 但是,你们知道吗?

    2024年02月08日
    浏览(70)
  • Android SDK安装教程(超详细),从零基础入门到实战,从看这篇开始

    前言 在使用appnium的时候,除了安装JDK之外,也需要安装Android SDK。那么,正确安装Android SDK是怎样的呢,跟着小编继续往下看。 安装Android SDK和环境配置 1.安装Android SDK 首先打开官网:https://www.androiddevtools.cn/ 选中导航中的Android SDK工具,再点击SDK Tools。 网页会自动往下翻,

    2024年02月14日
    浏览(55)
  • 目录(文章更新中...)《实战NFT web3 solidity(新版本0.8.+)》

    注:由于是付费专栏内容,若有错误请及时联系@1_bit,博客链接:https://blog.csdn.net/A757291228 ,或在文章下留言,收到后将会对错误进行改正,若是版本更新导致的问题也希望大家对错误进行提交,尽力去保证付费用户该得到的权益。 友情提示:本系列文章读者最好学过一门编

    2024年02月16日
    浏览(43)
  • 我用GPT写了一个关于GPT的文章,大家看看写的如何

    目录 I. 引言 1.1 研究背景和意义 1.2 现有研究综述 II. ChatGPT技术介绍 2.1 ChatGPT技术原理 2.2 ChatGPT技术优势 III. ChatGPT技术在智能客服中的应用和挑战 3.1 ChatGPT技术在智能客服中的应用 3.2 ChatGPT技术在智能客服中面临的挑战 3.3 优化用户体验提升ChatGPT技术在智能客服中的作用 IV

    2024年02月07日
    浏览(122)
  • 【Java-10】深入浅出线程安全、死锁、状态、通讯、线程池

    线程安全 线程死锁 线程的状态 线程间通讯 线程池 1.1 线程安全产生的原因 多个线程在对共享数据进行读改写的时候,可能导致的数据错乱就是线程的安全问题了 问题出现的原因 : 多个线程在对共享数据进行读改写的时候,可能导致的数据错乱就是线程的安全问题了 1.2 线程

    2024年02月11日
    浏览(69)
  • 【多线程】定时器,详解定时器原理,让大家更深刻的理解多线程

    前言: 大家好,我是 良辰丫 ,今天我们一起了解一下定时器,通过定时器来熟悉一下线程安全等相关知识点.💞💞💞 🧑个人主页:良辰针不戳 📖所属专栏:javaEE初阶 🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。 💦期待大家三连,关注

    2024年02月01日
    浏览(56)
  • java 多线程批量更新10万级的数据

           好久没有写文章,今天刚好没啥事,就动手记录一下,好记性不如烂笔头!言归正传,我最近接到的一个工作任务大概内容是,有一张数据量在十万+级别的表,需要新增一个字段,并且要写入初始化值。        业务其实非常的简单,全部查询出来一个列表,然后用

    2024年04月15日
    浏览(37)
  • 线程的状态,多线程带来的风险,synchronized关键字及死锁问题

    目录 状态  线程的意义 多线程带来的风险——线程安全✅ 线程安全的概念 线程不安全的原因 抢占式执行,随机性调度 修改共享数据 原子性-加🔒 可见性 指令重排序 解决线程不安全问题(学完线程再总结) synchronized——监视器锁monitor lock​编辑   互斥 使用示例

    2024年02月06日
    浏览(51)
  • 10分钟带你徒手做个Java线程池

    摘要: 花10分钟开发一个极简版的Java线程池,让小伙伴们更好的理解线程池的核心原理。 本文分享自华为云社区《放大招了,冰河带你10分钟手撸Java线程池,yyds,赶快收藏吧》,作者:冰 河。 看过Java线程池源码的小伙伴都知道,在Java线程池中最核心的类就是ThreadPoolExec

    2023年04月19日
    浏览(32)
  • 【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,结构体的基本使用和常见错误在上一篇详细讲解过了,不知道大家都学会了没有。    ⛳️ 今天给大家来个硬菜,教点高

    2024年02月15日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包