Javaday24 线程池 设计模式

【技术实践指南】Python解析FactSet Revere供应链数据:构建企业级断裂与重构监测指标 本文提供了一份企业级Python实践指南,详细解析如何利用FactSet Revere供应链数据库,构建供应链断裂与重构监测指标。内容涵盖数据清洗、关系对筛选、时间序列处理及核心指标(断裂、恢复、转移)的工程化实现,旨在帮助数据工程师与分析师搭建自动化、可解释的供应链风险监控系统。 阅读详情

Javaday24 线程池 设计模式

一 线程间的等待唤醒机制

object类中

void wait()在其他线程调用此对象那个的notify()方法或者notifyAll()方法前,导致当前线程等待。

void wait (long timeout) 在其他线程调用此对象的notify方法或notifyAll或者超过指定的时间量钱,导致当前线程等待。

void notify()唤醒在此对象监视器上等待的单个线程

void notify All()唤醒在此对象监视器上的所有线程

public class GetThread extends Thread {
    Student student;

    public GetThread(Student student) {
        this.student = student;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (student) {
                if (!student.flag) {
                    try {
                        student.wait();//没有资源等待,wait()方法一旦等待,就必须释放锁,从哪里等待,被唤醒后,就从这里醒来
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //消费了资源,通知生产线程去生产
                System.out.println(student.name + "===" + student.age);
                student.flag = false;
                student.notify();//唤醒等待的 线程
            }
        }
    }
}
public class SetThread extends Thread{
    Student student;
    int i=0;
    public SetThread(Student student) {
        this.student=student;
    }

    @Override
    public void run() {
        while (true){
            synchronized (student){
                //作为生产者来说:有了资源,等着,通知消费线程来消费
                if(student.flag){
                    try {
                        student.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                if (i % 2 == 0) {
                    student.name = "张三";
                    student.age = 23;
                    //等待...
                } else {
                    student.name = "李四";
                    student.age = 24;
                }

                //通知消费线程,去消费
                student.flag=true; //修改标记
                student.notify();//唤醒等待的线程,唤醒之后,多个线程还要再次争抢时间片
                i++;
            }

二 线程池的概述和使用

2.1 线程池概述

​ 程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。
​ 而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。
​ 线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
​ 在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池

2.2 内置线程池的使用概述

​ JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法
​ public static ExecutorService newCachedThreadPool(): 根据任务的数量来创建线程对应的线程个数
​ public static ExecutorService newFixedThreadPool(int nThreads): 固定初始化几个线程
​ public static ExecutorService newSingleThreadExecutor(): 初始化一个线程的线程池
​ 这些方法的返回值是ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。它提供了如下方法
​ Future<?> submit(Runnable task)
​ Future submit(Callable task)
​ 使用步骤:
​ 创建线程池对象
​ 创建Runnable实例
​ 提交Runnable实例
​ 关闭线程池

 public static void main(String[] args) {
        //线程池:是一个容器,装有一定线程对象的容器
        //从JDK5开始,Java内置支持线
        //ExecutorService 线程池
       // public static ExecutorService newCachedThreadPool ():根据任务的数量来创建线程对应的线程个数
        ExecutorService executorService = Executors.newCachedThreadPool();
        MyRunnable myRunnable = new MyRunnable();
        executorService.submit(myRunnable);
        executorService.submit(new MyRunnable());
        executorService.submit(new MyRunnable());
        executorService.submit(new MyRunnable());
        executorService.submit(new MyRunnable());
        executorService.submit(new MyRunnable());
        executorService.submit(new MyRunnable());
        //关闭线程池
        executorService.shutdown();
    }
}
public class MyTest3 {
    public static void main(String[] args) {
        //这个线程里面,提前创建三个线程对象
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        executorService.submit(new MyRunnable());
        executorService.submit(new MyRunnable());
        executorService.submit(new MyRunnable());
        executorService.submit(new MyRunnable());
        executorService.submit(new MyRunnable());
        executorService.submit(new MyRunnable());

        executorService.shutdown();
    }
}
public class MyTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        MyCallable myCallable = new MyCallable(10);

        Future<Integer> f = executorService.submit(myCallable);
        Integer integer = f.get();
        System.out.println(integer);

        MyCallable myCallable2 = new MyCallable(100);

        Future<Integer> f2 = executorService.submit(myCallable2);
        Integer integer1 = f2.get(); //获取线程执行完之后的返回结果
        System.out.println(integer1);
        executorService.shutdown();

    }
}

三 定时器

定时器概述
定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行。
在Java中,可以通过Timer和TimerTask类来实现定义调度的功能。

Timer和TimerTask
Timer:
public Timer()
public void schedule(TimerTask task, long delay):
public void schedule(TimerTask task,long delay,long period);
public void schedule(TimerTask task, Date time):
public void schedule(TimerTask task, Date firstTime, long period):
TimerTask
public abstract void run()
public boolean cancel()

public class MyTest {
    public static void main(String[] args) {
        //定时器 Timer
        //一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。
        Timer timer = new Timer();
       // public void schedule (TimerTask task,long delay):
        //延迟多少毫秒之后,让定时任务执行
        MyTimerTask myTimerTask = new MyTimerTask(timer);
        timer.schedule(myTimerTask,2000);

        //timer.cancel(); 取消定时器

    }
}
public class MyTimerTask extends TimerTask {
    Timer timer;
    public MyTimerTask(Timer timer) {
        this.timer=timer;
    }

    @Override
    public void run() {
        System.out.println("~~~~砰!爆炸了");
        timer.cancel();
    }
}
public class MyTimerTask extends TimerTask {
    Timer timer;
    public MyTimerTask(Timer timer) {
        this.timer=timer;
    }
    @Override
    public void run() {
        File file = new File("E:\\测试图片");
        delFolder(file);
        timer.cancel();//取消定时器
    }
    private void delFolder(File file) {
        File[] files = file.listFiles();
        for (File f : files) {
            if(f.isFile()){
               f.delete();
            }else{
                delFolder(f);
            }
        }
        file.delete();
    }
}
    

四 设计模式的概述和了解

设计模式概述
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性以及代码的结构更加清晰.

设计模式分类
创建型模式(创建对象的): 单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
行为型模式(对象的功能): 适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
结构型模式(对象的组成): 模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

4.1简单工厂模式概述: 又叫静态工厂方法模式,它定义一个具体的工厂类负责创建一些类的实例

优点: 使用静态工厂模式的优点是实现责任的分割,该模式的核心是工厂类,工厂类含有必要的选择逻辑,可以决定什么时候创建哪一个产品的实例,而客户端则免去直接创建产品的责任,而仅仅是消费产品。也就是说静态工厂模式在不改变客户端代码的情况可以动态的增加产品。明确了类的职责。

缺点: 这个静态工厂类负责所有对象的创建,如果有新的对象增加,或者某些对象的创建方式不同,就需要不断的修改工厂类,不利于后期的维护

public class MyTest {
    public static void main(String[] args) {
        //单例设计模式:单例:在内存中,只存在该类的一个对象
        //1.饿汉式
        //2.懒汉式
        Student student = Student.getStudent();
        Student student1 = Student.getStudent();
        System.out.println(student==student1);
    }
}
public class Teacher {
    //饿汉式
    private static Teacher teacher=new Teacher();
    private Teacher() {
    }

    public static Teacher getTeacher(){

        return teacher;
    }

}
从Verilog到GDS:手把手教你搞定Calibre LVS物理验证(附常见报错解决) 本文详细介绍了从Verilog到GDS的Calibre LVS物理验证全流程,包括工具链配置、RTL到SPICE网表转换、LVS运行配置及高级技巧。重点解析了常见报错如网络不匹配、器件不匹配和电源引脚缺失的解决方案,帮助工程师高效完成芯片物理验证,确保设计正确性。 阅读详情

相关推荐

LC整流滤波电路DIY:电感电容配合,手把手搭建低纹波直流电源

在直流电源设计中,整流滤波是连接交流输入与稳定输出的关键环节。常见的电容滤波虽然简单,但在大负载下纹波抑制能力有限,电感抵抗电流突变、电容抵抗电压突变,二者组合构成的LC滤波能有效降低输出电压纹波,同时减小开机浪涌电流。在工频线性电源、功放电源等对噪声敏感的场景中,LC滤波常作为稳压前的平滑缓冲。本文以一套完整DIY项目为线索,介绍整流桥后串联功率电感、并联滤波电容的电路构成,结合实际计算与波形测试,讨论电感量估算、电容选取、谐振风险、饱和电流等工程问题,并给出上电测试和故障排查方法。通过搭建与调试,可直观

weixin_29168813的博客 377

内部类-线程池-设计模式

方法内部能不能定义类? 可以,是方法内部类 请说明定义内部类的方式,并说明适用于什么情况 (1)成员内部类:定义在另一个类(外部类)的内部,而且与成员方法和属性平级,属于类的一个成员,可以用private,默认,protected,public四个访问修饰符修饰。 外部类无法直接访问成员内部类的方法和属性,需要通过内部类的一个实例来访问。 调用方式:外部类名.内部类名 实例名 = 外部类实例名.n...

qq_45564691的博客 751

低成本主从机械臂系统构建:6D位姿数据采集与VLA模型训练实战

本文详细介绍了如何构建低成本主从机械臂系统,实现高精度6D位姿数据采集与VLA模型训练。通过300美元级别的硬件组合,系统达到±1mm位置精度和≤0.5°姿态误差,满足Vision-Language-Action模型的多模态训练需求。文章涵盖硬件选型、数据采集技巧、模型训练实战经验,为机器人研究提供经济高效的解决方案。

r7s8t的博客 266

Java多线程设计模式之线程池模式

前序:   Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作。它将“委托消息的一端”和“执行消息的一端”用两个不同的线程来实现。该线程模式主要包括三个部分:   1,Request参与者(委托人),也就是消息发送端或者命令请求端   2,Host参与者,接受消息的请求,负责为每个消息分配一个工作线程。   3

guomei的专栏 836

halcon C++编程 第4讲 HObject/HImage Mat相互转换(tcy)

网上有很多相互转换程序,但并不知那个正确,本文对相互转换后的结果和原对象比较是否相同判断转换是否正确。经测试ok.本文包括转换代码及测试是否相同。 1.转换程序: /************************************ HObject转为Mat:time:2021/3/16 V1.0 *************************************/ cv::Mat HalconClass::HObjectToMat(const HalconCpp::HObject&..

tcy-阿春 4933

向量数据库安全实战:从Embedding反推到检索越权的全链路防护

随着RAG应用在企业中的普及,向量数据库已成为知识库系统的核心组件。但许多团队对向量数据的安全认知仍停留在传统数据库的账号密码、网络隔离和磁盘加密上。事实上,向量化并非加密,而是一种有损压缩的语义映射,向量本身可以被反推模型还原出原文关键信息,形成高保真的语义泄露通道。同时,相似度检索的模糊匹配特性打破了传统行列权限模型,使得越权检索和成员推断攻击成为新的安全威胁。理解这些原理,有助于企业在数据采集、向量化、索引构建、检索查询等环节构建分层防护体系,包括脱敏、扰动、过滤下推、网关控制等手段。本文从基础概念出

weixin_29323551的博客 259

24并发设计模式——线程池模式

实际上线程池模式属于GoF一书23种设计模式的一种或多种设计模式组合。线程池的主要优点包括减少创建和销毁线程的开销、提高资源的利用率、简化线程管理。它适用于需要处理大量短时间任务的场景(如高并发)。在实际应用中,线程池模式有助于提高系统的响应速度和吞吐量,减少资源浪费,并使任务处理更为高效和可控。

qq_55610255的博客 1735

mipi deskew原理理解

何为skew, 从字面意思看是倾斜了,不对齐了;放在mipi的传输中意思就是clock lane和data lane 及data lane与data lane间出现了相位差;一旦出现相位差,大家采样数据时就可能不在同一个节拍上,会出现传输错误。所以就要做deskew,通过做deskew来使得大家重新对齐,在同一个节奏下传输数据. 一般当data rate高于1.5G时建议开启deskew。

lx123010的专栏 8102

经典设计模式之 -- 线程池

简单介绍了线程池的概念,和Java标准库中的两个线程池相关类。 其中,重点介绍了,ThreadPoolExecutor 类的使用和其构造方法参数的概念。 另外还实现一个自己的线程池类。

想听风雨的博客 1646

硬件测试之—纹波测试为什么不要使用接地夹子

示波器为什么不推荐使用接地夹

qq_19294353的博客 2988

MBD-从一个示例看代码生成过程(rtw文件、TLC语言)

大概介绍了MBD代码生成流程,rtw文件、TLC语言

小胡同学的工程师学习之路 4214

线程池的理解

什么是线程池,有什么优缺点? 线程池是一个享元模式的设计模式 是一个容器,内部含有多个线程, 自主控制线程的生命周期,使用时直接获取,使用完后将线程再交还回去,减少了创建线程,销毁线程的开销 降低资源的消耗,重复利用已经创建的线程,提高响应的速度 提高线程的可管理性,同一份匹配,调优,监控 线程池的使用和工作机制 我们一般使用TreadPoolExecuror创建线程池,提交execute()方法和submit()方法 execute()方法作用于提交不需要返回值的任务,所以无法判断线程是否

sayhitoloverOvO的博客 655

Cesium 模拟飞机坠毁功能

Cesium 模拟飞机坠毁功能,粒子模拟

QQhelphelp的博客 1068

「JavaDay24 多线程 (2)」

JavaDay24 多线程(2) https://github.com/Philbenzy/Java-question-100/tree/main/day24 本节的主要知识点: (1)JDK5之后对于线程的锁定方法; (2)死锁问题; (3)线程之间通信问题:生产者与消费者; (4)线程组 (5)线程池 (6)多线程实现(三种) (7)多线程面试 (8)设计模式 (9)Runtime 1-JDK5之后对于线程的锁定方法 (1)lock锁 lock锁相对于synchronized锁相比,可以更加明确的看到锁

她的妈妈爱上我的博客 167

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

设计模式-线程池模式

定义: Worker Thread,一般都称为线程池。该模式事先启动一定数目的工作线程。当没有请求工作的时候,所有的工人线程都会等待新的请求过来,一旦有工作到达,就马上从线程池中唤醒某个线程来执行任务,执行完毕后继续在线程池中等待任务池的工作请求的到达。 任务池:主要是存储接受请求的集合,利用它可以缓冲接受到的请求,可以设置大小来表示同时能够接受最大请求数目。这个任务池主要是供线程池来访...

谈少华的博客 5229

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

设计模式:线程池

线程池是一种多线程管理机制,用于有效地管理和复用线程资源。通过预先创建一定数量的线程并将它们放入线程池中,可以避免频繁的创建和销毁线程,从而提高程序的运行效率。在需要执行任务时,线程池会分配一个空闲的线程执行任务。任务完成后线程不销毁,而是返回池中等待下一个任务的调用。线程创建具有较高的成本,线程池中复用线程的调用相对直接创建线程的系统资源开销和延迟都更低线程频繁的销毁会使内存碎片化,使用线程池不会频繁的删除线程而使内存碎片化,提高了内存的使用效率。

dalaoyuzuiniu的博客 758

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java第三十一天:线程池、设计模式

java第三十一天:线程池、设计模式 1.线程池的概述和使用(了解) A:线程池概述 ​ 程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。 ​ 而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。 ​ 线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。 ​ 在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池 B:内置线程池的使用概述 ​ JDK5新增了一个Ex

weixin_46682579的博客 384

Java由浅入深理解线程池设计和原理

目录 1 线程 1.1 什么是线程?什么是进程? 1.2 java中线程的实现方式有几种? 1.3 线程的生命周期是什么? 2 线程存在的问题 2.1 一个线程只能执行一个任务 2.2 线程执行完后销毁,无法复用 2.3 线程过多,导致JVM宕机 3 初识线程池 3.1 了解J.U.C 3.2 线程池解决了什么问题 3.3 线程池引发了什么问题 4 线程池的设计思想 5 线程池的原理 5.1 了解线程池类继承结构图 5.2 线程池工作状态 5.3 掌握线程池个参数定义 5.4 线程池结构说明 5.5 线程池

赵广陆 502

线程池和设计模式

Wait和Sleep的区别: 1.它们最大本质的区别是,Sleep()不释放同步锁,Wait()释放同步锁。 2.还有用法的上的不同是:Sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不 3.到你只能调用Interreput()来强行打断;Wait()可以用Notify()直接唤起。 4.这两个方法来自不同的类分别是Thread和Object 5.最主要是Sleep方法没有释放锁,而Wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。 进程的状态 初始(New):新

qq_45142938的博客 663

java常用的线程池模式,java中常见的六种线程池详解

之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池首先我们列出Java 中的六种线程池如下线程池名称描述FixedThreadPool核心线程数与最大线程数相同SingleThreadExecutor一个线程的线程池CachedThreadPool核心线程为0,最大线程数为Integer....

weixin_35651191的博客 652

设计模式鉴赏之ThreadPoolExecutor

ThreadPoolExecutor 中使用了多种设计模式,接下来我们一起来看看线程池中是如何落地各种设计模式的。闲话不多说,上代码。

ql_gome的博客 547

线程池设计

这些必须都传给线程池中的线程才行,线程池中的线程从任务中拿取输入数据调用解决方法,最后把输出结果写入,线程池不需要对任务做任何多余的操作!而这个方法函数叫做——回调函数。大体思路是:任务队列不为空就通过条件变量向线程池中的线程发送信号执行任务,如果任务队列为空,则线程池中的线程在cond条件变量下等待。大体思路是: 把信号量的大小设置成任务队列task_queue的大小,这样临界资源的粒度就变小了,实现了生产和消费的解耦。最后线程池被设计成了单例模式,可以保证该线程池全局唯一。结构体中的对象包括👇。

潜心钻研技术 936

设计模式在项目中的应用之线程池

设计模式分为三大类:创建型模式五种:简单工厂模式、抽象工厂模式、单实例模式、建造者模式、原型模式结构型模式七种:适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式行为型模式十一种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式额外几种模式:MVC模式、线程池模式、状态机模式写一手好的代码,如同做生意,让自己的店铺整洁有序,可以让人赏心悦目、让店铺客源滚滚。

qq_30578659的博客 736

阿里架构师浅析经典多线程设计模式,你看懂了吗?

推荐阅读 阿里Java研发面试题『八部曲』——从第一步开始 阿里Java研发面试题『八部曲』——基础必备 未完待续… 一、Future模式 思想: 当service(Main方法模拟)请求一个数据的时候,可以先给他返回一个包装类(空壳,代理对象,未来data,FutureData);然后开一个线程去异步加载真实数据,这样当service收到FutrueData,就可以做其他业务逻辑,当要用...

Java_supermanNO1的博客 412

java 线程 设计模式_Java多线程设计模式(4)线程池模式

前序:Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作。它将“委托消息的一端”和“执行消息的一端”用两个不同的线程来实现。该线程模式主要包括三个部分:1,Request参与者(委托人),也就是消息发送端或者命令请求端2,Host参与者,接受消息的请求,负责为每个消息分配一个工作线程。3,Worker参与者,具体执行Request参与...

weixin_35273106的博客 208

设计模式面试题(总结最全面的面试题!!!)

文章目录设计模式什么是设计模式为什么要学习设计模式设计模式分类设计模式的六大原则开放封闭原则(Open Close Principle)里氏代换原则(Liskov Substitution Principle)依赖倒转原则(Dependence Inversion Principle)接口隔离原则(Interface Segregation Principle)迪米特法则(最少知道原则)(Deme...

小杰爱吃蛋的博客 6万+
上一篇: JAVAday23 多线程
下一篇: Java day26 网络编程
Lapiyaner
博客等级 码龄9年 0粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值