java多线程编程(四)-----线程池

一.线程池的介绍

java中的池是非常重要的思想方法,比如内存池,进程池,连接池,常量池等等。本篇重点介绍java中的线程池。这里的这些池的概念都是一样的,比如做饭的时候,有烧水,切菜,炒菜等流程,如果等水烧开再去炒菜,切菜效率会很慢,但是可以烧水的同时去切菜,炒菜,效率大幅提升。如果我们需要频繁的创造和销毁线程,此时创建和销毁线程的成本就不能忽视了,因此可以使用线程池。提前创建好一波线程,后续需要用线程只需要从线程池中拿,线程用完后继续放到池子里面。思考一下为什么从池子里面取,就比从系统中创建线程更快更高效呢?
在这里插入图片描述
假如小明要去银行取钱,这个时候发现忘记复印身份证了,小明现在有2个选择,1是把身份证交给柜台服务人员由他们去复印,但服务人员手里同时要处理很多事情,等身份证复印完可能已经花费了很多时间,是不可控的行为。但是如果自己在大厅复印机上复印,复印的时间完全自己掌握,同时属于可控行为,效率大幅度提升。线程也是这样,如果从系统中创建线程,需要调用系统api,进一步由操作系统内核完成(内核相当于柜台),内核是给所有进程提供服务的,通常也需要处理很多事情,是不可控的。如果从线程池这里获取线程,上述内核中要做的操作,现在在获取线程的过程中,纯粹由用户代码完成。

二.java标准库的线程池

java标准库中也提供了现成的线程池
1.创建一个固定线程数的线程池
在这里插入图片描述
2.创建一个线程数目动态变化的线程池
在这里插入图片描述
3.创建单个线程的线程池
在这里插入图片描述
4.创建定时器效果的线程池
在这里插入图片描述

一.工产方法

在这里插入图片描述
看到这种写法是不是语法很难看懂,并没有new一个对象就直接调用方法。其实这种写法是java设计模式中的工产模式,一般创建对象都是通过new,通过构造方法。但是通过构造方法有重大缺陷,构造方法名字固定就是类名,有的类需要多种不同的方法构造,但是构造方法的名字又固定,就只能使用重载的方式来实现了,但是参数的个数和类型有差别。
在这里插入图片描述
一个坐标可以由横坐标和纵坐标组成,也可以由半径和角度描述,但是如果2个构造方法的参数和类型相同会报错,这也就是构造方法的一个缺陷,为了解决这个问题引入了工产模式。使用普通方法来构造对象,这样方法的名字就可以是任意的了,普通方法内部再来new对象,由于普通方法目的是为了创建出对象来,这样的方法一般是静态的。
在这里插入图片描述
接着看一个工产模式的实例:

interface Shape{
    void run(int a,int b,String str);
}
class Range implements Shape{
    public int x;
    public  int y;
    @Override
    public void run(int x,int y,String str) {
        System.out.println("横纵坐标相加等于"+(x+y));

    }
}
class  Tangle implements  Shape{
    @Override
    public void run(int r,int a,String str) {
        System.out.println("半径乘以角度等于"+r*a);
    }
}
class Point1{
    public static Shape PointXY(int x,int y,String str){
        if(str=="Range"){
         Range range = new Range();
         range.run(x,y,str);
         return range;
        }else if(str=="Tange"){
          Tangle tangle = new Tangle();
          tangle.run(x,y,str);
          return tangle;
        }
        return  null;
    }

}
public class Test6 {
    public static void main(String[] args) {
        Shape shape = Point1.PointXY(2,3,"Range");
        Shape shape1 = Point1.PointXY(3,4,"Tange");
    }

}

在这里插入图片描述
看懂上述代码在来看创建线程池的方式就立刻明白
在这里插入图片描述
点开源码
在这里插入图片描述

三.线程池的参数

在这里插入图片描述1.int corePoolSize:核心线程数
ThreadPoolExecutor里面的线程个数并非是固定不变的,会根据当前的任务情况动态发生变化,corePoolSize至少得有这些线程,哪怕是你的线程池一点任务没有。

2.maximumPoolsize:最大线程数
ThreadPoolExecutor最多不能超过这些线程数,即使线程再忙。
3.longKeepAliveTime ,TimeUnit unit:最多等待时间,单位秒
当线程没有任务处理时,最多等待多少秒,等待时间一到如果还没有任务处理就会销毁。
4.BlockingQueue workQueue:线程内部有很多任务,这些任务可以使用阻塞队列来管理,线程池可以内置阻塞队列,也可以手动指定一个。
5.RejectedExecutionHandler handler:拒绝策略/拒绝方式(a,b,c,d)
a.线程池满了继续添加直接抛出异常,线程池之后不干活。
在这里插入图片描述
b.谁是添加这个新任务的线程,谁就去执行这个任务
在这里插入图片描述
c.丢弃最早的任务,执行新的任务
在这里插入图片描述
d.直接把新任务丢弃
在这里插入图片描述

四.线程池的实现

线程池计算斐波那契数列:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class Fib{
    public static int create(int n){
        if(n<=1){
            return 1;
        }
        return create(n-1)+create(n-2);
    }
}
public class Test8 {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(4);
        for(int i=0;i<10;i++){
            final int num=i;
            executorService.submit(()->{
                System.out.println("第"+num+"个斐波那契数是:"+Fib.create(num)+",第"+num+"个线程是"+Thread.currentThread().getName());
            });
        }
        executorService.shutdown();
    }
}

在这里插入图片描述
从结果上看确实只是用到了4个线程去计算。

import java.util.concurrent.TimeUnit;

public class Test9 {
    public static void main(String[] args) {
        RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.AbortPolicy();
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(4,10,30, TimeUnit.SECONDS,new LinkedBlockingDeque<>(), rejectedExecutionHandler);
        for(int i=0;i<5;i++){
            threadPoolExecutor.submit(()->{
                System.out.println(Thread.currentThread().getName());
            });
        }
    }
}

在这里插入图片描述
#五.自我模拟线程池

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

class ThreadPool2 {
    BlockingQueue<Runnable> blockingQueue = new LinkedBlockingDeque<>();

    public void submit(Runnable runnable) throws InterruptedException {
        blockingQueue.put(runnable);
    }

    public ThreadPool2(int n) {
        for (int i = 0; i < n; i++) {
            Thread thread = new Thread(() -> {
                while (true) {
                    try {
                        blockingQueue.take().run();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            });
            thread.start();
        }
    }
}

public class Test11 {
    public static void main(String[] args) throws InterruptedException {
        ThreadPool2 threadPool = new ThreadPool2(4);
        for (int i = 0; i < 10; i++) {
            threadPool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello");
                }
            });
        }
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/433173.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据开发-Hadoop之HDFS高级应用

文章目录 HDFS回收站HDFS的安全模式定时上传数据至HDFSHDFS的高可用和高扩展HDFS写数据过程源码剖析 HDFS回收站 HDFS会为每个用户创建一个回收站目录:/user/用户名/.Trash/回收站中的数据都会有一个默认的保存周期&#xff0c;过期未恢复则会被HDFS自动彻底删除默认情况下HDF…

用友-UFIDA-NC saveDoc.ajax 存在任意文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

【投稿优惠|优质会议】【主题广范|见刊快】2024年艺术设计与公共管理国际学术会议(ICADPM 2024)

【投稿优惠|优质会议】【主题广范|见刊快】2024年艺术设计与公共管理国际学术会议(ICADPM 2024) 2024 International Conference Art and Design and Public Management 一、【会议简介】 会议主题为“艺术设计与公共管理的融合与创新”&#xff0c;将涵盖多个子主题&#xff…

罐区自动防爆气象站的功能优势

TH-FBCQX1(FB01)罐区自动防爆气象站在现代工业安全中扮演着至关重要的角色。其独特的设计和强大的功能确保了罐区在易燃易爆环境中的安全&#xff0c;同时提供了精准的气象数据&#xff0c;为企业提供了有力的决策支持。以下是罐区自动防爆气象站的主要功能优势&#xff1a; 防…

2024年Java社招面试题,字节跳动算法工程师面试总

前言 Spring让我们可以更快&#xff0c;更轻松&#xff0c;更安全地进行Java编程。Spring对速度&#xff0c;简单性和生产率的关注使其成为世界上最受欢迎的Java框架。 像阿里巴巴&#xff0c;亚马逊&#xff0c;谷歌&#xff0c;微软等在内的所有科技巨头对Spring都有很大的…

ubuntu_定制文件系统[2]-清理日志log

1.问题现象 系统长时间运行, 产生大量的系统日志 ubuntu/debian 系统日志如下 /var/log$ du -sh * 31M syslog # syslog日志 61M syslog.1 2.5G journal/ # systemd service日志 当日志文件过大, 硬盘空间占用100%时, 导致各种异常 命令按tab补全无响应服务/进程启动异常服务…

一文搞懂所有常见数据结构

一&#xff0c;概念 计算机只能处理0和1&#xff0c;计算机能把0和1转换成电路中的信号来计算&#xff0c;这个就是计算机的本质。 bit 比特 bit就是计算对数据存储的最小单元&#xff0c;只有两个值0和1&#xff0c;简写为b。 - byte 字节 8个bit1个byte字节&#xff08;8位一…

「经验」在博途中 是否可以在 LAD与STL 语言之间进行切换

用惯了STEP7&#xff0c;准确来说是SIMATIC Manager进行编程开发的同学&#xff0c;在转战TIA portal后&#xff0c;通常会经历一段“晦涩”的过度期&#xff0c;包括指令库的微小变动、工作界面的大改等等。 又比如&#xff1a;“在博途中&#xff0c;怎么快速切换LAD与STL语…

小白跟做江科大51单片机之AT24C02数据存储

1.导入Delay、key、LCD1602相关文件 2.控制逻辑 以I2C去写入&#xff0c;用AT24C02包装好&#xff0c;main调用即可 3.编写I2C代码 看着这六个状态编 图1 开和关 图2 发送一个字节 图3 接收一个字节 图4 接收和发送应答 #include <REGX52.H> sbit I2C_SCL P2^1; sbi…

纹波和噪声有啥区别?看完不会你打我!

大家好&#xff0c;我是砖一。 今天给大家分享一下电源纹波和电源噪声都是在电源输出中出现的信号波动&#xff0c;但两者存在明显的区别。 一&#xff0c;纹波 电源纹波是指电源输出时&#xff0c;叠加在稳定的直流电源上的交流成分。这种波动主要是由于电源自身的开关、PW…

羊大师揭秘羊奶的魔力,滋养与美容的双重奇迹

羊大师揭秘羊奶的魔力&#xff0c;滋养与美容的双重奇迹 羊奶在滋养与美容方面确实有着双重奇迹般的效果。首先&#xff0c;从滋养的角度来看&#xff0c;羊奶富含优质蛋白质、矿物质和维生素&#xff0c;这些营养物质对于维持人体正常生理功能、促进生长发育和增强免疫力都至…

UR机器人装箱姿态

1.官网手册上并没有给出该打包位姿 2.一般厂家发回来的机器人都会有这个打包程序 可以运行这个程序&#xff0c;如果有的话。 3.打包点位 如果没有这个这个&#xff0c;也可以直接按下面点位来&#xff0c;都是差不多的点位&#xff0c;可以放到包装箱中的 这个是UR10的 这个…

什么是企业数字化转型?传统企业开始走下坡路必看篇!

今天的话题有点变化&#xff0c;但这个内容确实会让很多人不爽&#xff01; 但耐心看下去还是有一定收获&#xff0c;为什么今天会说到传统企业&#xff1f; 我做内容营销也有很多年了&#xff0c;今天就说说自己遇到的很多企业都会面临的一些问题&#xff0c;以及该如何应对&…

【学习笔记】计算机视觉深度学习网络模型

这是本人学习计算机视觉CV领域深度学习模型的学习的一点点学习笔记&#xff0c;很多片子没有完成&#xff0c;可以作为学习的参考~

鸿蒙next标签栏无法自动更新,解决懒加载问题

1.问题描述&#xff1a; 在开发鸿蒙时&#xff0c;我们会遇到这样一个局面&#xff0c;在Entry组件修饰下的根组件跳转至其他Component修饰的组件时只能在组件初始的时候加载一次&#xff0c;其余情况默认原先的加载状况以至于用户无法实时获取正确的信息。 2.问题过程 2.1 …

bind方法

bind 方法与 call 和 apply 不同&#xff0c;它不会立即执行函数&#xff0c;而是返回一个新的函数&#xff0c;并将指定的对象作为新函数中的 this 值。bind 方法在实际使用中常用于创建一个指定上下文的函数&#xff0c;以便稍后调用。 // bind方法 const bookEW book.bind…

(C语言)深入理解指针1基础

指针是C语言中的一个难点&#xff0c;但如果真正理解了指针&#xff0c;其实没有很难&#xff0c;本篇文章介绍了指针的基础知识&#xff0c;后面还会继续更行指针的内容。感谢支持。 目录 1. 内存和地址 1.1 内存 1.2 究竟该如何理解编址 2. 指针变量和地址 2.1 取地址操…

智能指纹密码储物柜的设计

目 录 摘 要 II Abstract III 引 言 1 1 总体方案设计 3 1.1 设计要求 3 1.2 方案比较与论证 3 2 硬件介绍和设计 5 2.1 单片机及最小系统 5 2.2 液晶显示模块 6 2.3 按键控制部分电路 7 2.4 指纹模块 8 2.5 继电器模块 9 3 系统软件设计 10 3.1 系统程序工作分析 10 3.2 主程…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+OSD动态字符叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收HLS多路视频融合叠加应用…

maven archetype 项目原型

拓展阅读 maven 包管理平台-01-maven 入门介绍 Maven、Gradle、Ant、Ivy、Bazel 和 SBT 的详细对比表格 maven 包管理平台-02-windows 安装配置 mac 安装配置 maven 包管理平台-03-maven project maven 项目的创建入门 maven 包管理平台-04-maven archetype 项目原型 ma…