第九节 Java多线程

状态估计【卡尔曼滤波kalman】UKF、EKF、粒子滤波PF学习与研究(Matlab代码实现) 内容概要:本文围绕非线性状态估计中的三种经典滤波算法——无迹卡尔曼滤波(UKF)、扩展卡尔曼滤波(EKF)和粒子滤波(PF)展开系统性学习与研究,重点在于通过Matlab编程实现这些算法的核心流程,并将其应用于实际系统的状态估计问题中。文档不仅详细阐述了各算法的数学原理、适用条件与性能差异,还提供了完整的仿真代码与案例分析,帮助读者深入理解其在非线性、非高斯环境下的表现特性。同时,资源拓展至EKF与神经网络融合训练、多源数据融合等高级应用场景,展现了其在智能控制、无人机导航、电力系统状态估计、目标跟踪等领域的广泛应用价值。; 适合人群:具备一定信号处理、控制理论或状态估计基础的研究生、科研人员及工程技术人员,尤其适用于从事自动化、机器人、导航、电力电子与智能系统等相关方向的研究与开发工作者;; 使用场景及目标:① 掌握UKF、EKF与PF在非线性系统中的建模思路与Matlab实现方法,理解其优缺点与适用边界;② 提升科研仿真能力,能够独立构建状态估计模型并进行算法对比验证;③ 将所学方法应用于如电池SOC估算、无人机姿态估计、传感器融合、故障诊断等实际工程问题中;; 阅读建议:建议结合Matlab动手实践,逐行解读并调试所提供的代码,深入理解算法实现细节;同时可延伸学习文中提及的数据融合、神经网络与滤波器结合等进阶主题,以构建完整的状态估计技术知识体系。 立即下载

多线程简介

线程的基本知识

线程是程序运行的基本单位,一个程序可以运行多个线程,可以提高程序的运行效率。

线程是具有一定顺序的指令序列,存放方法中定义局部变量的栈和一些共享数据。

线程是相互独立的,任何线程都不能访问其他线程的局部变量。

如果两个线程同时访问一个方法,那每个线程各自得到此方法的一个拷贝。

Java实现线程的两种方式

派生Thread类

实现Runable接口。

创建线程的两种方法

Thread创建线程

/*
    继承Thread类创建线程
 */
class MyThread extends Thread{
    public MyThread(){}
    public MyThread(String name){
        super(name);
    }
    //重载run函数
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(this.currentThread().getName()+"="+i);
        }
    }
}

//创建线程
    public static void main(String[] args) {
        //创建线程
        MyThread myThread = new MyThread("线程1");
        myThread.start();
        MyThread myThread1 = new MyThread("线程2");
        myThread1.start();
    }

实现Runable接口创建线程

/*
    实现Runable接口来创建线程
    Thread类中有以下两个构造方法:
        Thread(Runnable target)
        Thread(Runnable target, String name)
 */

class MyRunable implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"="+i);
        }
    }
}

//创建线程
    public static void main(String[] args) {
        Thread myThread = new Thread(new MyRunable(),"线程1");
        myThread.start();
        Thread myThread1 = new Thread(new MyRunable(),"线程2");
        myThread1.start();
    }

等待线程结束

通过isAlive判断

class Main{
    public static void main(String[] args) throws InterruptedException {
        Thread myThread = new Thread(new MyRunable(),"线程1");
        myThread.start();
        //判断如果第一个线程在执行,那么让主线程等待,一直执行完线程1之后,再往下执行
        while (myThread.isAlive()){
            Thread.sleep(1);
        }
        //执行完线程1,执行线程2
        MyThread myThread1 = new MyThread("线程2");
        myThread1.start();
    }
}

通过join方法

class Main{
    public static void main(String[] args) {
        Thread myThread = new Thread(new MyRunable(),"线程1");
        myThread.start();
        /*
            join方法
                join()-myThread.join()
                join(微秒,纳秒)——myThread.join(10,1000)
         */
        try {
            myThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //执行完线程1,执行线程2
        MyThread myThread1 = new MyThread("线程2");
        myThread1.start();
    }
}

线程的声明周期

线程的生命周期

线程一共有四种状态:
1. 创建状态
创建在new之后,start之前。
2. 可运行状态
可运行状态在对象执行start之后
3. 不可运行状态
不可运行状态,指线程处于被挂起或者阻塞的状态,例如调用wait()后,线程可能进入阻塞状态;调用线程的notify或者notifyAll后才会再次返回到可运行状态。
4. 退出状态
线程可以在任何状态下调用stop方法进入退出状态,除此之外,线程run完,即执行完也会自动进入退出状态。

线程状态转换
线程状态转换

线程状态转换函数
线程状态转换函数

其中stop,suspend和resume方法已经不提倡使用。
suspend由wait方法替代
resume方法由sleep方法替代
线程退出采用自然中止方法,不建议人工调用stop方法。

线程调度(优先级)

多线程应用程序的每个线程的优先级可能不同。

当多个线程等待CPU时间片时,优先级高的能抢占CPU并执行

java中,CPU抢占式的。因此,优先级高的执行的抢占CPU次数较多。

优先级数字1-10

优先级常数:Thread.NORM_PRIORITY,Thread.MAX_PRIORITY,Thread.MIN_PRIORITY

class Main{
    public static void main(String[] args) {
        Thread myThread = new Thread(new MyRunable(),"线程1");
        Thread myThread1 = new Thread(new MyRunable(),"线程2");
        myThread.setPriority(10);//设置优先级1-10
//        myThread.setPriority(Thread.MAX_PRIORITY);
        myThread1.setPriority(1);
//        myThread1.setPriority(Thread.MIN_PRIORITY);

        myThread.start();
        myThread1.start();
    }
}

线程的同步

Java应用程序的多线程可以共享资源,当线程以并发模式访问共享数据时,共享数据可能会出现冲突。

java引入线程同步,可以实现共享数据的一致性。

在线程异步的情况下,同一个时刻一个线程修改数据,而另一个线程读取数据,那么读取的数据将会是错误数据。

比如,线程1和线程2都出售火车票,两个线程共享票数,出现以下情况就会出错:
1. 线程1发现票T
2. 线程2发现票T,售出
3. 线程1售出T。
如果线程按照上面顺序出售车票,那么车票T被出售了两次。

java通过sysnchronized关键字锁住共享代码区,从而实现线程同步。

几种同步实现方式
1. 同步方法

class Main{
    public static void main(String[] args) {
        Acount acount = new Acount();
        acount.setCount(100);
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName());
                    acount.show();
                    acount.addMoney(100);
                    System.out.println("----");
                }
            }
        },"线程1----").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName());
                    acount.show();
                    acount.subMoney(20);
                    System.out.println("----");
                }
            }
        },"线程2----").start();


    }
}
//使用同步方法
class Acount{
    private int count;
    //存钱
    public synchronized void addMoney(int money){
        count+=money;
        System.out.println("存进="+money+"元");
    }
    //取钱
    public synchronized void subMoney(int money){
        count-=money;
        System.out.println("取钱="+money+"元");
    }
    //查询余额
    public void show(){
        System.out.println("余额="+count+"元");
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}
  1. 同步代码块
class Acount{
    private int count;
    //存钱
    public void addMoney(int money){
        synchronized (this) {
            count += money;
            System.out.println("存进="+money+"元");
        }

    }
    //取钱
    public  void subMoney(int money){
        synchronized (this) {
            count -= money;
            System.out.println("取钱="+money+"元");
        }
    }
    //查询余额
    public void show(){
        System.out.println("余额="+count+"元");
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}

synchronized关键字

synchronize修饰的方法和 synchronize(this) 都是锁住自己本身的对象 而synchronize(class) synchronize(object) 都是锁别的对象

D类功放LC滤波器实战:从Q值0.707到EMI优化的完整设计流程 本文详细解析了D类功放LC滤波器的完整设计流程,从确定截止频率与Q值0.707的理论基础出发,到参数计算、仿真验证及关键元器件选型,并提供了应对EMI超标和过流保护等实际问题的进阶调试策略。文章强调,精准的LC滤波器设计是平衡音质、稳定性与电磁兼容性的关键,尤其需关注电感饱和电流与电容直流偏置等细节。 阅读详情

相关推荐

3D视觉入门必看:深度图、点云图、IR图、RGB图像到底有什么区别?

本文深入解析了3D视觉中深度图、点云图、IR图与RGB图像的核心区别。深度图记录像素距离,是连接2D与3D的桥梁;点云图是显式的三维坐标集合;IR图感知红外光强度;RGB图像则提供颜色纹理。理解其信息维度和应用场景,是进行机器人导航、三维重建等任务的基础。

year5的博客 342

第九节 Java 多线程

第九节 Java 多线程1. 线程的概述2. 线程的创建2.1 Thread类实现多线程2.2 Runnable 接口实现多线程2.3 Callable 接口实现多线程2.4 三种实现多线程方式比较2.5 后台线程3. 线程的生命周期及状态转换4. 线程的调度4.1 线程的优先级4.2 线程休眠4.3 线程让步4.4 线程插队5. 多线程同步5.1 同步代码块5.2 同步方法5.3 同步锁5.4 死锁问题6. 多线程通信 1. 线程的概述 在我们的操作系统中,每个独立执行的程序都可称为一个进程,我们之所以可

fancy_hacker的博客 588

基于三轴加速度计的塑料水管泄漏振动检测技术全解析

在流体力学与结构动力学领域,管道振动分析是评估系统健康状态的关键技术。其基本原理在于,当管道内流体状态发生异常(如泄漏)时,会引发管壁产生特定的机械振动信号。这项技术的核心价值在于实现了对管道系统的非侵入式、在线监测,能够提前预警潜在故障,避免资源浪费与次生灾害。在智慧城市与智能水务等应用场景中,它对于保障供水管网安全、提升运维效率具有重要意义。本文聚焦于如何利用高精度的三轴加速度计,精准捕捉塑料水管因泄漏产生的微弱振动,并通过信号处理与机器学习算法,构建一套从数据采集到泄漏识别与定位的完整工程解决方案。

weixin_32239523的博客 407

java 多线程网络编程_第九节:详细讲解Java中的泛型,多线程,网络编程

前言大家好,我是 Vic,今天给大家带来详细讲解Java中的泛型,多线程,网络编程的概述,希望你们喜欢泛型泛型格式:ArrayList list= new ArrayList();ArrayList list= new ArrayList<>();Type可以为类,接口使用泛型可以使加入的,不用被强制通配符ArrayList extends Type> list= new Arr...

weixin_42333370的博客 145

Ubuntu 上 1Panel 的安装与高效运维实践

本文详细介绍了在Ubuntu系统上安装和高效运维1Panel面板的完整实践指南。内容涵盖了一键安装、Docker容器可视化部署、计划任务自动化以及网站数据库管理等核心功能,并提供了安全加固、资源监控与数据备份等进阶技巧,旨在帮助用户快速搭建并管理一个强大易用的服务器环境。

weixin_29210759的博客 143

Spring Boot集成Jasypt踩坑实录:自定义SM4加密器Bean加载失败的终极解决方案

本文深入剖析了Spring Boot集成Jasypt时自定义SM4加密器Bean加载失败的根源,即Spring Boot启动流程中Bean加载顺序与Jasypt自动配置的时序冲突。文章提供了三种从源码层面解决问题的有效方案,包括使用ApplicationContextInitializer提前注册、调整Bean依赖顺序以及自定义PropertySource处理机制,并给出了完整的国密SM4加密器实现与测试示例。

weixin_29294975的博客 200

第九节:详细讲解Java中的泛型,多线程,网络编程

前言大家好,我是 Vic,今天给大家带来详细讲解Java中的泛型,多线程,网络编程的概述,希望你们喜欢泛型泛型格式:ArrayList&lt;Type&gt; list= new ArrayList&lt;Type&gt;();ArrayList&lt;Type&gt; list= new ArrayList&lt;&gt;();Type可以为类,接口使用泛型可以使加入的,不用被强制通配符Arra...

程序员哆啦A梦,蓝胖子 534

【WRF理论第十五期】WPS中输入geogrid二进制格式

WPS中输入geogrid二进制格式

WW、forever的博客 1079

二维 线程块_第九节:详细讲解Java中的泛型,多线程,网络编程

泛型泛型格式:ArrayList<Type> list= new ArrayList<Type>();ArrayList<Type> list= new ArrayList<>();Type可以为类,接口使用泛型可以使加入的,不用被强制通配符ArrayList<? extends Type> list= new ArrayList<...

weixin_35796591的博客 122

SMMU软件指南SMMU编程之流表(Stream Table)

SMMU使用一组内存中的数据结构来定位翻译数据,详见“转换过程概述”(Translation process overview)。SMMU_(*_)STRTAB_BASE 存储初始结构(流表,Stream Table)的基地址。流表项(Stream Table Entry, STE)包含二级(Stage 2)转换表的基址指针,同时也定位一级(Stage 1)配置结构,这些配置结构包含转换表的基址指针。 传入事务的 StreamID,由 SEC_SID 进行限定,决定了用于查找的流表,并定位相应的STE。

AI-安全-功耗 1189

TMF8801 ToF激光测距传感器原理图设计,已量产(距离传感器)

这张 TMF8801 小板的外围结构就很有代表性。核心传感器是 U1 TMF8801,但真正构成量产价值的是外围那一圈:U2 把 VCC 整理成 3V,R1/R2/R5 与 R3/R4/R6 两组 10K 电阻稳定默认态,Q2 2N7002 和 U3 SN74LVC2G07DCKR 处理控制链路,传感器边上还有 C1/C4/C5 三颗 100nF 紧贴去耦。

不脱发的程序猿 159

java 镶嵌创建线程_第九节:详细讲解Java中的泛型,多线程,网络编程

前言大家好,我是 Vic,今天给大家带来详细讲解Java中的泛型,多线程,网络编程的概述,希望你们喜欢泛型泛型格式:ArrayList list= new ArrayList();ArrayList list= new ArrayList<>();Type可以为类,接口使用泛型可以使加入的,不用被强制通配符ArrayList extends Type> list= new Arr...

weixin_36134871的博客 105

ubuntu linux虚拟机安装部署openclaw详细教程(安装、问题处理)

本文详细介绍了在Ubuntu系统下安装OpenClaw AI助手的完整流程及常见问题解决方案。主要内容包括:1) 通过GIT、Node.js等基础环境配置;2) 使用官方脚本或源码编译两种方式安装OpenClaw;3) 配置向导中的关键选项说明;4) 针对systemctl服务启动失败等常见错误的处理方法。文章特别强调了权限管理、网络依赖和访问配置等易错环节,提供了修改service文件等具体解决方案,帮助开发者顺利完成部署并实现Web UI访问。教程实操性强,适合本地和云服务器环境部署参考。

少说,多做 2032

JAVA多线程编程

JAVA的背景和历史JAVA的特点和应用领域如何安装和配置JAVA开发环境。

Kali与编程 1018

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【JavaEE初阶】第九节.多线程 (基础篇)定时器(案例三)

​ 继多线程的阻塞队列之后,我们来学习一下 第三个经典的案例 —— 定时器; 定时器,也是开发中的一个比较常用的基础组件; 定时器,就像闹钟一样,闹钟在达到一个设定的时间以后,就会发出响声来提醒;而定时器到了设定好的时间以后,就会执行某个指定好的代码; ​

未央的博客哟 7567

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JAVA 年轻代收集器 第九节

JAVA 年轻代收集器 第九节 继续上一章所讲的,STW即GC时候的停顿时间,他会暂停我们程序中的所有线程。如果STW所用的时间长而且次数多的话,那么我们整个系统稳定性以及可用性将大大降低。 因此我们在必要的时候需要对虚拟机进行调优,那么调优的主要目标之一就是降低STW的时间,也就是减少Full GC的次数。那么这里我们从...

abcdef00001111234的博客 85

蓝牙模块HM-10手册

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

多线程与高并发实战第九节

首先我们简单回顾一下前面三节课讲的内容,分别有线程的基本概念、synchronized、volatile、AtomicXXX、各种JUC同步框架(ReentrantLock、CountDownLatch、CyclicBarrier、Phaser、ReadWriteLock-StampedLock、Semaphore、Exchanger、LockSupport),其中synchornized重点讲了一下,包括有synchornized的底层实现原理、锁升级的概念(四种状态:无锁、偏向锁、轻量级锁、重量级锁),

啦啦啦的博客 335

北上广深,2024,多少K的Java程序员应该懂高并发多线程和JVM优化

可能有人会问我为什么愿意去花时间帮助大家实现求职梦想,因为我一直坚信时间是可以复制的。我牺牲了自己的大概十个小时写了这片文章,换来的是成千上万的求职者节约几天甚至几周时间浪费在无用的资源上。上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源。

2401_83703893的博客 744

java高级特性 - 多线程基础(3)线程同步_北上广深,2020,多少K的Java程序员应该懂高并发多线程和JVM优化...

初级—初阶掌握java基础,熟悉常用类库。理解javaweb中的servlet,jsp,并了解常用的框架对java web的封装原理,能够借助框架完成增删改查功能。理解数据库在web开发中的地位。初级—中阶理解java中较为高级的特性,如反射,动态代理,JVM,内存模型,多线程等等。熟练使用框架,对框架中遇到的bug,能够借助日志和搜索引擎分析出问题的原因。在团队中,能够独立完成普通后台业务功能的...

weixin_39628380的博客 281

多线程 第九节 线程池

Thread Pool 1、 为了避免系统频繁的创建和销毁线程,我们可以将创建的线程进行复用。 2、 在线程池中总有那么几个活跃的线程,也有一定的最大值限制,一个业务使用完线程之后,不是立即销毁而是将其放入到线程池中,从而实现线程的复用。简而言之:创建线程变成了从线程池获取空闲的线程,关闭线程变成了向池子中归还线程。 3、 线程池优点: 1) 可重复使用已有线程,避免对象创建、消亡和过度切换的性能开销。 2) 避免创建大量同类线程所导致的资源过度竞争和内存溢...

ellen艾琳的博客 185

学习笔记【多线程-第九节:线程池】

线程也叫轻量级进程LWP(Light Weight Process) 两种线程模型 用户级线程ULT: 用户程序实现,不依赖操作系统核心,应用提供创建,同步,调度和管理线程的函数来控制用户线程;不许用户态/内核态切换,速度快;内核对ULT无感知,线程阻塞及进程阻塞。 内核级线程KLT: 系统内核管理线程,内核保存线程的状态和上下文信息,线程阻塞不会引起进程阻塞。在多处理器系统上,多线程在多处理器上并行运行。线程的创建、调度和管理由内核完成,效率比ULT慢,比进程操作快。 Java用的时KLT线程模型。 UL

qq_53273362的博客 234

辛星Java多线程教程第零篇:写在前面

使用Java这么久,一直想写一系列关于多线程的文章。虽然在工作中经常使用,但是真的要写一系列教程的时候,却感觉思路并不是特别清晰。因此这个系列的教程也可能是想到哪写到哪,并不能百分之百的确保布局的严谨。了解Java的多线程,是了解Java的第一步,也是非常重要的一步。 本系列教程主要是从如下几个方面介绍: 第一节: 初始线程、 第二节: 线程识别、 第三节: 线程状态、 第四节: 后台线程、 第五...

辛星,前进的路上. 354

扫地神僧:Java开发者如何应对多线程与高并发面试题目?

发某粉丝年前参加某个NB企业的面试题列表: 聊聊synchronized的CPU原语级别实现 有一千万个数,写一个程序进行高效求和 已知2开平方为1.414,如何不用数学库,求开平方的值,精确到小数点儿后面10位 编码实现两个线程,线程A不断打印1-10的数字,要求在打印到第五个数字的时候通知线程B 自定义线程池需要指定哪7个参数,为什么不建议使用JUC内置线程池? 高并发、任务执行时...

JavaAOE的博客 836

【软件工程自考】java语言基础第九节

网络编程基础关于C/S(客户端)和B/S模式(浏览器)B/S常用的语言是JSP。

weixin_56591289的博客 775

Java第十一课——多线程实现飞机大战

Java第十一课——多线程实现飞机大战 一、补充讲解一下线程 在第九课的基础上补充两点: 1、启动线程使用start()方法而不直接使用rin()方法,因为线程是一直重复执行的,调用run方法只会执行一次,所以用start方法启动线程 2、当小球跑的很远,跑出窗体时,便可以把小球移出去,用remove()方法 list.remove(ball) 可以给小球加入一个getX()方法获取小球的x坐标,当x大于窗体长度时移除。因为小球是放在队列里面的,所以队列里可能有很多小球,那么可以用遍历的方式获取到要移除的小

mlgseminent的博客 1255

从”0“开始学JAVA——第九节下 泛型和集合框架

上一节我们介绍了泛型的概念、集合框架的两大根接口——Collection(单列集合)接口、Map(双列集合)接口,以及Collection接口下的两个重要的子接口——List接口和Set接口,除此之外还举例了这几个接口的常用方法。:当数组容量不足时,会自动扩容(通常是增加为原来的1.5倍)。例如:缓存需要按访问顺序淘汰(可实现LRU)、记录用户操作序列(去重且有序)。获得的位置)进行插入和删除操作,只需要修改相邻节点的指针,时间复杂度为。元素(取决于使用的比较器,如果使用自然排序,则不允许)。

m0_74754754的博客 988
上一篇: 第六节 Java异常处理
下一篇: 第八节 Java IO流
江城子_Lay
博客等级 码龄9年 19粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值