Java Day 29

如何用Megatron-LM搭建多卡集群?手把手教你配置分布式训练环境 本文提供了一份详细的Megatron-LM多卡集群搭建实战指南。从硬件兼容性检查、软件栈版本对齐,到分布式并行策略(数据并行、张量并行、流水线并行)的配置与多节点启动脚本编写,手把手教你配置稳定高效的分布式训练环境,并分享了关键的排错与性能调优经验。 阅读详情

多线程

        概念

                程序和进程

  • 程序 - 数据结构 + 算法,主要指存放在硬盘上的可执行文件。
  • 进程 - 主要指运行在内存中的可执行文件。
  • 目前主流的操作系统都支持多进程,为了让操作系统同时可以执行多个任务,但进程是重量级的, 也就是新建一个进程会消耗CPU和内存空间等系统资源,因此进程的数量比较局限。

                线程   

  • 为了解决上述问题就提出线程的概念,线程就是进程内部的程序流,也就是说操作系统内部支持多 进程的,而每个进程的内部又是支持多线程的,线程是轻量的,新建线程会共享所在进程的系统资源,因此目前主流的开发都是采用多线程。
    • 多线程是采用时间片轮转法来保证多个线程的并发执行,所谓并发就是指宏观并行微观串行的机制。  

      线程的创建 

                        使用Thread类

                                方式1

//创建Thread
public class ThreadTest {
    public static void main(String[] args) {
        //使用无参方式构造Thread类性对象
        //由源码可知,Thread 类中的成员变量target的数值为null
        Thread t1 = new Thread();
        //调用run方法进行测试
        //由源码可知,成员变量target的数值为null,条件(target!=null)不成立,{}中的代码跳过不执行,且没有其他代码,所以run方法没有进行任何操作
        t1.run();

    }
}
//创建子类
public class SubThreadRun extends Thread{
   @Override
    public void run(){
       for (int i =1; i<=20;i++){
           System.out.println(i);
       }
}
---------------------------------------------------------------------------
public class SubThreadRunTest {
    public static void main(String[] args) {
        //声明Thread类型的引用指向子类类型的对象
        Thread t1 =new SubThreadRun();
        //调用run方法测试,本质上相当于普通成员方法的调用,因此执行流程就是run方法的代码执行完毕后才能继续向下执行
        //t1.run();
        //用于启动线程,Java虚拟机会自动调用该线程类中的run方法,相当于又启动了一个线程,加上执行main方法的线程是两个线程
        t1.start();
    }
}

                                 方式2

public class SubRunnableRun implements Runnable{
    @Override
    public void run() {
        for (int i =1; i<=20;i++){
            System.out.println(i);
        }
    }
}
------------------------------------------------------
public class SubRunnableRunTest {
    public static void main(String[] args) {
        //创建自定义类型的对象,也就是实现Runnable接口类的对象
        SubRunnableRun srr =new SubRunnableRun();
        //使用该对象作为实参构造Thread类型的对象
        //由源码可知,经过构造方法的调用之后,Thread类中的成员变量target的数值为srr
        Thread t1 = new Thread(srr);
        //使用Thread类型的对象调用Start方法
        //使用Runnable引用构造了线程对象,调用该方法(run)时最终调用接口中的版本
        t1.start();
    }
}

                匿名内部类的方式实现线程创建和启动

public class ThreadNonameTest {
    public static void main(String[] args) {
        //使用继承加匿名内部类的的方式创建并启动线程
        /*Thread t1 =new Thread(){
            @Override
            public void run(){
                System.out.println("aaa");
            }
        };
        t1.start();*/
        new Thread(){
            @Override
            public void run(){
                System.out.println("aaa");
            }
        }.start();
        //使用接口加匿名内部类的方式创建并启动线程
       /* Runnable ra = new Runnable(){
            @Override
            public void run(){
                System.out.println("bbb");
            }
        };
        Thread t2 = new Thread(ra);
        t2.start();*/
       /* new Thread(new Runnable(){
            @Override
            public void run(){
                System.out.println("bbb");
            }
        }).start();*/
        //Java8开始支持lambda表达式:(形参列表)->{方法体;}
      /*  Runnable ra = ()->System.out.println("bbb");
        new Thread(ra).start();*/
        new Thread(()-> System.out.println("bbb"));
    }
}

        线程的生命周期

        线程的名称和编号

 

        常用方法

Sleep方法 

Priority方法 

 

Daemon方法


 案例

public class SubThread extends Thread {
    @Override
    public  void run(){
        for(int i =1; i<100;i +=2){
            System.out.println("子线程1中"+i);
        }
    }


}
-------------------------------------------------
public class SubThread2 extends Thread {
    @Override
    public  void run(){
        for(int i =2; i<=100;i +=2){
            System.out.println("子线程2中"+i);
        }
    }

}
////////////////////////////////////////////////

public class SubThreadTest {
    public static void main(String[] args) {
        SubThread st1 = new SubThread();
        SubThread2 st2 = new SubThread2();
        st1.start();
        st2.start();
        System.out.println("主线程开始等待");
        try {
            st1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        try {
            st2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程等待结束");
    }
}

        线程同步机制

电商秒杀场景下,如何用Redis+Lua脚本实现原子性库存扣减(附完整代码) 本文针对电商秒杀场景下的高并发与超卖难题,详细解析了如何利用Redis的原子性命令与Lua脚本实现可靠的库存扣减。通过对比多种方案,阐述了Redis+Lua作为黄金搭档的技术原理,并提供了从基础扣减到预扣减模型的完整代码实现,确保在高并发下数据的一致性与系统性能。 阅读详情

相关推荐

PyTorch实战:从零构建CNN图像分类模型

卷积神经网络(CNN)作为计算机视觉的核心架构,通过局部连接和权值共享机制高效处理图像数据。其核心组件包括卷积层、池化层和全连接层,其中PyTorch的动态计算图特性为CNN实现提供了灵活的开发环境。在工程实践中,使用CIFAR-10这类标准数据集可以快速验证模型性能,而数据增强和批归一化等技术能有效提升模型泛化能力。通过PyTorch实现CNN不仅能够掌握图像分类的基本原理,还能为后续迁移学习和复杂视觉任务打下基础,特别是在结合Adam优化器和学习率调度策略后,模型收敛速度和准确率都能得到显著提升。

weixin_42405592的博客 297

Java Day29

异常处理 两种Java中处理异常的方式 【捕获】 有能力处理你就捕获,自己的问题你就捕获 【抛出】 没有办法处理,或者不是自己的问题,和自己无关,因别人导致的错误,抛出 捕获异常 格式: try { // 有可能出现问题的代码,存在一定隐患的代码 } catch (异常类型) { // 对应当前异常类型的处理方式 // 【因为技术所限,我们只能sout 或者 printStackTrace 后期我们会使用 日志log】 } `` ```java package com.qfedu.a_except

qq_47101128的博客 177

GNSS/RTK定位失效时的替代方案:视觉惯性里程计(VIO)

GNSS/RTK定位失效时的替代方案:视觉惯性里程计(VIO)​ ,人工智能,计算机视觉,大模型,AI,本文详细介绍了视觉惯性里程计(VIO)作为GNSS/RTK定位失效时的替代方案。阐述了VIO的定义、优势及与其他定位技术的区别,讲解了视觉传感器和IMU的工作原理及数据融合原理,分析了时间同步、标定等关键技术,介绍了VINS-Mono等常用框架、简单代码示例、应用场景,还探讨了VIO面临的挑战与未来发展趋势,展现了其在多个领域的重要性与应用潜力。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 16万+

JAVA学习————Day29

LinkedList和Set 1. LinkedList 1.1 LinkedList概述 底层存储数据是一个双向链表结构 自行车链子 就是一个生活中链表结构,环环相扣,替换,拆除非常方便 1.2 LinkedList需要了解的方法 LinkedList使用的方法都是从List接口实现而来的方法,需要了解的是LinkedList特有方法: boolean addFirst(E e); 在当前链表开始位置加元素 boolean addLast(E e); 在当前链表末尾添加元素 E getFirst();

m0_47074358的博客 201

java day29——JDBC

这里写目录标题标题Statement执行sql语句executeexecuteupdateexecutequeryPreparedstatement预编译好处 标题 工具类+属性集 Statement执行sql语句 execute executeupdate executequery Preparedstatement预编译 预编译之后就不要再传sql语句了 好处 ...

qq_40905010的博客 187

Java_day25-29

(1) 为什么是线程不安全的主要原因是它的操作不是原子的,即在多个线程同时进行读写操作时,可能会导致数据不一致性或抛出异常.**并发修改:**当一个线程进行写操作(插入、删除等)时,另一个线程进行读操作,可能会导致读取到不一致的数据,甚至抛出 ConcurrentModificationException 异常。非原子性操作:HashMap 的一些操作不是原子的,例如,检查是否存在某个键、获取某个键对应的值等,这样在多线程环境中可能发生竞态条件。(2)如何实现线程安全。

Q95470的博客 799

Java入门基础day29

Java入门基础

zpz2001的专栏 996

java算法day29

如果num-1还在数组中,那说明这个num肯定不是序列的起点,如果不在数组中,那么就能肯定,是序列的起点。那么定位到了起点之后,就要从起点开始遍历整个序列,直到当前数的num+1并不存在于数组中时,可以判断遍历终止,因此还需要能够快速判断num后面的num+1是否存在于数组中。最直观的想法应该就是为了统计每个连续序列的长度,那么我们希望定位到每个连续序列的起点。这个题问的最长连续序列指的是数字依次递增的序列的最长长度。那么就是0,1,2,3,4,5,6,7,8长度为9。那么就是1,2,3,4。

TOMOT77的博客 578

JAVA入门】Day29 - 泛型

泛型是 JDK5 中引入的新特性,可以在编译阶段约束操作的数据类型,并进行检查。泛型的格式很简单:< 数据类型 >要注意:泛型中只能写。泛型就像一个检查数据是否符合要求的质检员,如果数据符合泛型要求,就可以存入集合。

oo00Z00oo的博客 1003

day29-java

网络编程、Socket、TCP、UDP

agjnhga的博客 174

Java,八股,cv,算法——双非研0四修之路day29

JVM底层原理学习,配置了VM、Xshell和Xdpt,重温了linux的操作命令,找左下角的值,路径总和

qq3094554285的博客 903

Spring 源码系列(23): SpringApplication.run() 启动全流程

本文深入解析了SpringApplication.run()的核心流程,通过源码拆解揭示了从启动到容器就绪的完整生命周期。文章重点分析了三个关键阶段:prepareEnvironment的配置加载逻辑(系统属性>环境变量>配置文件)、createApplicationContext的容器类型推断机制(基于classpath判断Web/Reactive/普通应用),以及callRunners的启动后回调特性(按@Order执行初始化任务)。同时澄清了常见误区,如内嵌Tomcat实际在refresh阶段的onR

不才不才不不才的博客 407

Java 并发灵魂拷问:notify/signal 唤醒顺序是规范还是实现?

本文探讨了Java中Object.notify()和Condition.signal()唤醒线程的顺序问题。关键结论如下: Object.notify(): JVM规范未规定唤醒顺序,HotSpot实现虽采用FIFO(从WaitSet头部取线程),但这属于实现细节而非规范要求 由于synchronized是非公平锁,被唤醒线程需重新竞争锁,最终执行顺序无法保证 严禁业务代码依赖该顺序 Condition.signal(): 严格按FIFO顺序唤醒(AQS等待队列头部线程) 是设计约定,业务可合理依赖该特性

weixin_68315058的博客 363

[Java]-微服务面试题

服务降级是服务自我保护的一种方式,或者保护下游服务的一种方式,用于确保服务不会受请求突增影响变得不可用,确保服务不会崩溃。微服务的负载均衡主要使用了一个组件Ribbon,比如,我们在使用feign远程调用的过程中,底层的负载均衡就是。2,我们还在skywalking设置了告警规则,特别是在项目上线以后,如果报错,我们分别设置了可以给相关负责人。简历上写的微服务,只要是发生了多个服务之间的写操作,都需要进行分布式事务控制。2,在客户端的配置文件中,可以配置某一个服务调用的负载均衡策略(局部)

. 616

Java Spring 批量修改,实体、接口、方法的定义

本文描述了一个批量更新车辆类型的接口实现。该功能通过Controller层接收包含出库单ID列表和车辆类型的请求参数,调用Service层进行处理。实现层采用事务管理,首先验证参数有效性,然后查询对应出库单数据并批量更新车辆类型字段,最后返回操作结果(成功更新记录数或错误信息)。该接口主要用于快递业务中其他出库单的车辆类型批量修改操作,包含完整的参数校验、异常处理和事务管理机制。

LYBWWP 55

并发 13 · 异步编排

摘要:本文探讨了异步编排在秒杀下单场景中的应用,分析了传统Future的局限性,并介绍了CompletableFuture如何通过链式调用解决任务依赖与并行问题。文章详细讲解了创建异步任务、串联任务(thenApply/thenCompose)、合并任务(thenCombine/allOf)以及异常处理等核心方法,强调使用独立线程池避免阻塞公共资源。最后结合秒杀案例,展示了如何构建高效、清晰的异步流水线,优化响应时间。全文提供代码示例和选型建议,帮助开发者实现高性能异步流程编排。

记录后端技术的深水区:MySQL、并发、JVM、分布式。原理为主,实战为辅,能少踩一个坑是一个。 403

简单聊聊 OpenFeign 框架源码

骨架:JDK 动态代理 + 方法元数据 + handler 分发,和 MyBatis 同一套路;主线:调用 → 填 RequestTemplate → 拦截器 → 负载均衡选实例 → Client 执行 → Decoder 解码,异常走 ErrorDecoder/Retryer/fallback;Spring 整合三件事扫描注册 FactoryBean、懒构建代理、给每个客户端独立配置;面试主线。

weixin_47626220的博客 385

Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器

加了它之后,@Sensitive 就等价于 @JsonSerialize(using = SensitiveJsonSerializer.class) ,Jackson才能识别并触发我们的序列化器。Jackson默认不认识我们自定义的 @Sensitive 注解,@JacksonAnnotationsInside 的作用是:允许把 @JsonSerialize 组合进自定义注解。时,数据库里存的一直是完整值,脱敏是一个展示的动作,而存储层要保护数据应该使用。的这一层比较好,下面是具体实现。

sjkflw121150的博客 213

LangChain4J

Prompt:好比UI层,进行用户交互Langchain4j, Spring AI:好比Controller,调用AI大模型各类AI大模型:好比Service,提供人工智能服务向量数据库:好比Mapper,进行数据存储。

渔阳的博客 189

Spring配置文件

本文系统介绍了配置文件的作用、Spring Boot支持的配置文件格式及其特点。首先阐述了配置文件解决硬编码问题、实现程序灵活配置的核心价值,并以手机字体大小为例说明其应用场景。接着详细讲解了Spring Boot支持的三种配置文件格式(.properties、.yml、.yaml),包括它们的加载优先级和共存规则。最后分别深入分析了properties配置文件的键值对语法、@Value注解读取方式及其冗余信息缺点,以及yml配置文件的基本语法、引号使用规则和优缺点对比,为开发者选择合适的配置文件格式提供参

qq_71356343的博客 253

家政派单系统开发实战:架构设计与派单算法指南

家政派单系统是连接用户需求与上门服务人员的核心调度平台,其开发难点并不在于简单的CRUD,而是在于如何设计一套能支撑“多角色、多任务类型、高并发抢单”的架构,以及一套能让订单和师傅效率化的派单算法。一旦师傅手动拒绝系统派单,近1小时的接单权重下降50%,防止师傅只接高价单而忽略普通单,导致用户体验受损。建议优先搭建一个可配置化的规则引擎,将派单距离、服务类目、师傅等级做成后台可调整的配置项,这样后期运营调整策略时,无需修改代码。师傅接单后的轨迹追踪,是提升用户体验的关键,也是开发的难点。

zww8949111的博客 321

Java 并发编程筑基篇

Java并发编程基础摘要 本文档系统介绍Java并发编程核心知识,分为基础概念、进阶原理和实战三部分。基础部分涵盖: 进程/线程/协程:操作系统资源分配与调度的不同层级单位 并发概念:区分并发/并行、同步/异步等关键术语 线程原理:生命周期、状态转换、上下文切换开销 创建方式:Thread/Runnable/Callable/线程池四种实现 线程安全:可见性、原子性、有序性问题及解决方案 进阶部分深入synchronized、volatile、线程池等核心机制,最后通过实战巩固。适合Java基础复习、面试准

2201_75455813的博客 328

大学生通用《材料力学》试题库(含答案).pdf

大学生通用《材料力学》试题库(含答案)

PSCAD中微电网定直流电压控制、PQ控制的多种分布式电源(光伏、风机等)并网模型

PSCAD中微电网定直流电压控制、PQ控制的多种分布式电源(光伏、风机等)并网模型,实现了分布式电源发电和并网要求,仿真结果理想.zip

上一篇: Java Day 28
下一篇: Java 30
芝士土豆泥儿
博客等级 码龄4年 9粉丝 67原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值