Day10配置文件日志多线程
配置文件
在企业开发过程中,我们习惯把一些需要灵活配置的数据放在一些文本文件中,而不是在Java代码写死 我们把这种存放程序配置信息的文件,统称为配置文件
properties
是一个Map集合(键值对集合),但是我们一般不会当集合使用。
核心作用:Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容
使用Properties读取属性文件里的键值对数据
使用Properties把键值对数据写出到属性文件里去
public class Demo1 {public static void main(String[] args)throws IOException {//1. 创建一个配置文件对象Properties properties = new Properties();properties.setProperty("name","卷王");properties.setProperty("age","18");properties.store(new FileWriter("E:\\Code191Day\\day10\\a-1.properties"),"卷王个人介绍");//2. 读取properties.load(new FileReader("E:\\Code191Day\\day10\\a-1.properties"));System.out.println(properties.getProperty("name"));System.out.println(properties.getProperty("age"));Set<String> set = properties.stringPropertyNames();for (String s : set) {System.out.println(s + properties.getProperty(s));}}
}
Properties的作用?具体如何使用?
可以加载属性文件中的数据到Properties对象中来
void load(Reader reader)
public String getProperty(String key) 根据键获取值
可以存储Properties属性集的键值对数据到属性文件中去
void store(Writer writer, String comments)
public Object setProperty(String key, String value) 设置键值
XML
本质是一种数据的格式,可以用来存储复杂的数据结构,和数据关系。
XML的特点
1.XML中的“<标签名>” 称为一个标签或一个元素,一般是成对出现的。
2.XML中的标签名可以自己定义(可扩展),但必须要正确的嵌套。
3.XML中只能有一个根标签。
4.XML中的标签可以有属性。
5.如果一个文件中放置的是XML格式的数据,这个文件就是XML文件,后缀一般要写成.xml
XML的语法规则
1.XML文件的后缀名为:xml,文档声明必须是第一行
<?xml version="1.0" encoding="UTF-8" ?>
version:XML默认的版本号码、该属性是必须存在的
encoding:本XML文件的编码
2.XML中可以定义注释信息:<!–- 注释内容 -->,快捷键是Ctrl+shift+/
3.XML中书写”<”、“&”等,可能会出现冲突,导致报错,此时可以用如下特殊字符替代。
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号
4.XML中可以写一个叫CDATA的数据区: <![CDATA[ …内容… ]]>,里面的内容可以随便写。
XML的作用和应用场景
本质是一种数据格式,可以存储复杂的数据结构,和数据关系。
应用场景:经常用来做为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。
XML的作用
XML的是一种可扩展的标记语言。
作用:1)作为软件的配置文件 2)用于进行存储数据和传输数据
解析XML文件
Dom4j解析XML-得到Document对象
DOM4J解析XML文件的思想:文档对象模型
<?xml version="1.0" encoding="UTF-8" ?>
<users><user id="1"><name>张无忌</name><password>minmin</password><address>光明顶</address><gender>男</gender></user><user id="2"><name>敏敏</name><password>wuji</password><address>光明顶</address><gender>女</gender></user>
</users>
public class Demo2 {public static void main(String[] args) throws DocumentException {List<User> list = new ArrayList<>();//1.使用SAXReader读取XML,封装成DocumentSAXReader saxReader = new SAXReader();Document read = saxReader.read("E:\\Code191Day\\day10\\b-2.xml");//获取跟节点Element rootElement = read.getRootElement();//获取根元素下的子元素List<Element> elements = rootElement.elements();//遍历集合获取每个元素for (Element element : elements) {String id = element.attributeValue("id");String name = element.element("name").getText();String password = element.element("password").getText();String address = element.element("address").getText();String gender = element.element("gender").getText();User user = new User(Integer.valueOf(id),name,password,address,gender);list.add(user);}list.stream().forEach(System.out::println);}
}
Element提供的方法
约束文档
门用来限制xml书写格式的文档,比如:限制标签、属性应该怎么写。
约束文档的分类
1.DTD文档
2.Schema文档
日志技术
程序中的日志,通常就是一个文件,里面记录的是程序运行过程中的各种信息。
1.可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中)。
2.可以随时以开关的形式控制日志的启停,无需侵入到源代码中去进行修改。
Logback日志框架
想使用Logback日志框架,至少需要在项目中整合如下三个模块:
1.slf4j-api:日志接口
2.logback-core
3.logback-classic
实现步骤
public class Demo1 {public static final Logger LOGGER = LoggerFactory.getLogger("Demo1");public static void main(String[] args) {LOGGER.debug("哈哈哈");LOGGER.error("除法报错");try {LOGGER.warn("除数为0");sum(10, 2);}catch (Exception e){LOGGER.error("除法报错");}}public static int sum(int a,int b){LOGGER.info("输入的参数:a={},b={}",a,b);int c = a / b;return c;}}
日志级别
多线程
1.单线程:在计算机中同一时间只能做一件事
2.多线程:在计算机中同一时间可以做多件事
public class Demo1 {public static final Logger logger = LoggerFactory.getLogger("Demo1");public static void main(String[] args) {//需求:创建两个线程,分别用于打印10个A和10个B,最后观察下输出顺序new Thread(){@Overridepublic void run() {Thread.currentThread().setName("卷王线程");for (int i = 0; i < 10; i++) {logger.info(Thread.currentThread().getName() + i);}}}.start();new Thread(){@Overridepublic void run() {Thread.currentThread().setName("阿giao线程");for (int i = 0; i < 10; i++) {logger.info( Thread.currentThread().getName() + i);}}}.start();}
}
线程的创建方式
方式一继承Thread类
1.定义一个子类继承线程类java.lang.Thread,
2.重写run()方法 创建子类的对象
3.调用子类对象的start()方法启动线程(底层会自动去执行run方法)
public class Demo1 {public static final Logger logger = LoggerFactory.getLogger("Demo1");public static void main(String[] args) {//需求:创建两个线程,分别用于打印10个A和10个B,最后观察下输出顺序new Thread(){@Overridepublic void run() {Thread.currentThread().setName("卷王线程");for (int i = 0; i < 10; i++) {logger.info(Thread.currentThread().getName() + i);}}}.start();new Thread(){@Overridepublic void run() {Thread.currentThread().setName("阿giao线程");for (int i = 0; i < 10; i++) {logger.info( Thread.currentThread().getName() + i);}}}.start();}
}
多线程的创建方式二:实现Runnable接口
public class Demo1 {public static final Logger logger = LoggerFactory.getLogger("Demo1");public static void main(String[] args) {//需求:创建两个线程,分别用于打印10个A和10个B,最后观察下输出顺序new Thread(() -> {for (int i = 0; i < 10; i++) {logger.info("Agiao = {}", i);}},"Agiao"){}.start();new Thread(() -> {for (int i = 0; i < 10; i++) {logger.info("展丫鹏 = {}" , i);}},"展丫鹏"){}.start();}
}
多线程的第三种创建方式:利用Callable接口、FutureTask类来实现
public class Demo1 {public static final Logger logger = LoggerFactory.getLogger("Demo1");public static void main(String[] args) throws ExecutionException, InterruptedException {//需求:启动两个子线程,分别计算100之内的奇数的和和偶数的和,然后在主线程中再做个汇总,得到总和//2.创建任务类对象OddCallable oddCallable = new OddCallable();EvenCallable evenCallable = new EvenCallable();//3.创建未来任务的对象,可以获取线程执行的结果FutureTask<Integer> integerFutureTask1 = new FutureTask<>(oddCallable);FutureTask<Integer> integerFutureTask2 = new FutureTask<>(evenCallable);//4.创建线程类Thread thread1 = new Thread(integerFutureTask1,"计算奇数");Thread thread2 = new Thread(integerFutureTask2,"计算偶数");//5.启动线程thread1.start();thread2.start();//6.从FutureTask对象中获取线程执行结果//假设结果还没有算出来,线程会在此等待Integer oddSum = integerFutureTask1.get();Integer evenSum = integerFutureTask2.get();logger.info("{}",oddSum + evenSum);}}class OddCallable implements Callable<Integer>{@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 1; i <= 100; i+=2) {sum += i;}return sum;}
}class EvenCallable implements Callable<Integer>{@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 0; i <= 100; i+=2) {sum += i;}return sum;}
}
请对对比说一下三种线程的创建方式,和不同点?
相关文章:

Day10配置文件日志多线程
配置文件 在企业开发过程中,我们习惯把一些需要灵活配置的数据放在一些文本文件中,而不是在Java代码写死 我们把这种存放程序配置信息的文件,统称为配置文件 properties 是一个Map集合(键值对集合),但是我…...

leetcode:1154. 一年中的第几天(python3解法)
难度:简单 给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。 示例 1: 输入:date "2019-01-09" 输出:9 解释:给定日期是2019年的第九天。 示例…...

竞赛 深度学习图像修复算法 - opencv python 机器视觉
文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步:将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…...
flutter升级+生成drift文件
1. flutter升级 可以安装fvm进行flutter version manager FVM 安装笔记 - 掘金 (juejin.cn) 使用flutter upgrade, 但是没有效果, 可能需要到我的电脑中,更改高级系统设置;改变/增加环境变量;用来加上flutter官网获取信息的内…...

[AUTOSAR][诊断管理][ECU][$34] 下载请求
文章目录 一、简介二、服务请求报文定义肯定响应支持的NRC三、示例代码34_req_dowload.c一、简介 RequestDownload(0x34)—— 下载请求 这个服务主要是用来给ECU下载数据的,最常见的应用就是在bootloader中,程序下载工具会发起下载请求,以完成ECU程序的升级。 二、服务…...
C 标准库 - <errno.h>和<float.h>详解
目录 简介 常见库宏 简介 常见库宏 <errno.h> 简介 <errno.h>头文件定义了一个名为errno的全局变量,用于表示最近发生的错误代码。errno是一个整数变量,它的值通常是一个非零的错误代码,用于指示发生了什么类型的错误。也可以…...
对于如何学习的一点思考
目录 1、学习遇到的问题 2、问题分析 3、解决思路 1、学习遇到的问题 我们经常在学习一个知识时,经常会遇到知识点凌乱、读书效率低、缺乏长期记忆等问题,主要体现在: 知识点凌乱:花时间学习了很多技术点,但是由于…...
Ensemble Methods集成学习大比拼:性能、应用场景和可视化对比总结
集成学习(Ensemble Learning)是一种机器学习范式,其中多个模型(通常称为“弱学习器”)被训练以解决相同的问题,并且通过某种方式结合它们的预测以提高整体性能。这种方法的核心思想是,多个模型比单一模型更能准确地预测未知数据。在本文中,我们将探讨多种集成学习算法,…...

【2024秋招】2023-9-16 贝壳后端开发二面
1 自我介绍 2 秒杀系统 2.1 超卖怎么解决 3 redis 3.1 过期策略 3.2 过期算法 4 kafka 4.1 说一说你对kafka的了解 4.2 如何保证事务性消息 4.3 如何保证消息不丢失 4.4 消息队列的两种通信方式 点对点模式 如上图所示,点对点模式通常是基于拉取或者轮询…...

SpringCloud 微服务全栈体系(七)
第九章 Docker 一、什么是 Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署,环境不一定一致…...

SAP ABAP 报表输出成 excel 统计图形 (RFC : GFW_PRES_SHOW_MULT)
SAP 预设了一个类型组 GFW ,做简单的excel图形输出 话不多说,直接上代码: *&---------------------------------------------------------------------* *& Report ZCYCLE057 *&----------------------------------------------…...
微信小程序如何获取地理位置
在微信小程序中,可以通过以下步骤获取用户的地理位置: 在小程序的app.json文件中配置权限: json "permission": {"scope.userLocation": {"desc": "你的位置信息将用于获取附近的服务"} }这样配置后…...

计算机网络相关硬件介绍
计算机相关硬件 计算机由运算器、控制器、存储器、输入设备和输出设备等五个逻辑计算机硬件部件组成。 一、中央处理器(CPU)(运算器、控制器) (1)运算器 运算器是对数据进行加工处理的部件ÿ…...

Megatron-LM GPT 源码分析(三) Pipeline Parallel分析
引言 本文接着上一篇【Megatron-LM GPT 源码分析(二) Sequence Parallel分析】,基于开源代码 GitHub - NVIDIA/Megatron-LM: Ongoing research training transformer models at scale ,通过GPT的模型运行示例,从三个维…...

Python---使用turtle模块+for循环绘制五角星---利用turtle(海龟)模块
首先了解涉及的新词汇,编程外国人发明的,所以大部分是和他们语言相关,了解对应意思,可以更好理解掌握。 import 英 /ˈɪmpɔːt/ n. 进口,进口商品;输入,引进;重要性;…...
Python的比较运算符查询表
据个人的编程开发经验,Python的比较运算符最常于条件判断,而条件判断是python编程中最常用的语法之一,与for或while的循环一样,功能十分强大! 在机器学习当中,或深度学习当中,在运用算法对统计…...

C/C++面试常见问题——const关键字的作用和用法
首先我们需要一下const关键字的定义,const名叫常量限定符,当const修饰变量时,就是在告诉编译器该变量只可访问不可修改,而编译器对于被const修饰的变量有一个优化,编译器不会专门为其开辟空间,而是将变量名…...

Vue3.3指北(四)
Vue3.3指北 1、WebPack - VueCLI1.1、WebPack安装VueCli1.2、vue create 创建项目1.3、项目目录结构介绍 2、ViteVue32.1、认识create-vue2.2、使用create-vue创建项目2.3、项目目录剖析2.4、ESlint代码规范及手动修复2.5、通过eslint插件来实现自动修正 3、VueRouter43.1、单页…...
vue如何使用路由拦截器
在 Vue 中使用路由拦截器需要使用 Vue Router 提供的 beforeEach 方法。beforeEach 方法会在每个路由切换前,对路由进行拦截处理。可以在这个方法中进行一些验证或者权限认证,如果满足条件则继续跳转,否则取消跳转并进行相应处理。 下面是一…...
Docker 深度清除镜像缓存 (overlay2)
Docker 深度清除镜像缓存 (overlay2) 一般情况下,运维清理镜像是通过命令 docker rm i 删除镜像的。但是这条命令不会删除docker build命令产生的缓存文件。 这个时候需要使用 docker system 的系列命令来做相关处理。 docker system --hel…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...