Day10配置文件日志多线程

news2024/11/15 11:57:35

配置文件

在企业开发过程中,我们习惯把一些需要灵活配置的数据放在一些文本文件中,而不是在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中书写”<”、“&”等,可能会出现冲突,导致报错,此时可以用如下特殊字符替代。

    &lt;    <  小于

    &gt;    >  大于

   &amp;   &  和号

   &apos;  '  单引号

   &quot;  "  引号

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,封装成Document
        SAXReader 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(){
            @Override
            public void run() {
                Thread.currentThread().setName("卷王线程");

                for (int i = 0; i < 10; i++) {
                    logger.info(Thread.currentThread().getName() + i);
                }
            }
        }.start();

        new Thread(){
            @Override
            public 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(){
            @Override
            public void run() {
                Thread.currentThread().setName("卷王线程");

                for (int i = 0; i < 10; i++) {
                    logger.info(Thread.currentThread().getName() + i);
                }
            }
        }.start();

        new Thread(){
            @Override
            public 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>{

    @Override
    public Integer call() throws Exception {

        int sum = 0;
        for (int i = 1; i <= 100; i+=2) {

            sum += i;
        }

        return sum;
    }
}

class EvenCallable implements Callable<Integer>{

    @Override
    public Integer call() throws Exception {

        int sum = 0;
        for (int i = 0; i <= 100; i+=2) {

            sum += i;
        }

        return sum;
    }
}

请对对比说一下三种线程的创建方式,和不同点? 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言之数组详解

目录 一维数组的定义和使用 二维数组的定义和使用 字符数组和字符串 练习题 练习一 练习二 练习三 一维数组的定义和使用 当涉及到一系列相同类型的数据时&#xff0c;C语言中的一维数组是一种非常有用的数据结构。以下是关于C语言一维数组的定义和使用的详细说明&…

威联通NAS进阶玩法之使用Docker搭建个人博客教程

Hello大家好&#xff0c;本篇教程主要教大家在威联通的NAS上搭建属于自己的个人博客网站&#xff0c;首先介绍一下我使用的机器&#xff0c;四盘位威联通TS-464C2&#xff0c;搭载四核四线程的N5095处理器&#xff0c;支持4K60帧的输出以及PCIE3.0,可玩性还是非常高的。废话不多…

网工内推 | 应届、大专可投,IE认证优先,有年终奖、带薪年假

01 伟众信息 招聘岗位&#xff1a;网络工程师&#xff08;应届生&#xff09; 职责描述&#xff1a; 1、网络架构及信息安全规划、设计&#xff1b; 2、制定撰写项目方案、投标文件技术方案、行业技术文档等&#xff1b; 3、路由交换、网络安全设备等网络设备安装、调试及后…

css 雷达扫描图

html 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css 雷达扫描</title><style>* {margin: 0;padding: 0;}body {background: #000000;height: 100vh;display: flex;align-items…

论文解读:《DataPype:用于计算机辅助药物设计的全自动统一软件平台》

论文解读&#xff1a;《DataPype: A Fully Automated Unified Software Platform for Computer-Aided Drug Design》 1.文章概述2.背景2.方法2.1 DataPype概述2.2 数据2.3 分子和蛋白质数据的处理2.3.1 配体处理2.3.2 蛋白质加工 2.4 CADD方法2.5 基准研究2.5.1 单个 CADD 制备…

Swoole 4.8版本的安装

1、从github拉取安装包 Release v4.8.13 swoole/swoole-src GitHub 2、解压压缩包 tar -zxvf ./v4.8.13.tar.gzcd ./swoole-src-4.8.13 3、执行安装命令 phpize && \ ./configure && \ make && sudo make install 4、检查swoole模块是否安装完成…

第一章 函数 极限 连续(未完更新中)

了解 一、函数的性质 理解 一、函数 1、函数概念 ⚠️定义域和对应规则是同一函数的判断 2、复合函数 简单的说就是内层函数的值域与外层函数的定义域有交集 3、反函数 3.1、yx^3为反函数&#xff0c;yx^2不是 3.2、单调函数是反函数的充分非必要条件&#xff08;单调函数…

Python爬虫(二十四)_selenium案例:执行javascript脚本

本章叫介绍如何使用selenium在浏览器中使用js脚本&#xff0c;更多内容请参考&#xff1a;Python学习指南 隐藏百度图片 #-*- coding:utf-8 -*- #本篇将模拟执行javascript语句from selenium import webdriver from selenium.webdriver.common.keys import Keysdriver webdri…

经典链表试题(二)

文章目录 一、移除链表元素1、题目介绍2、思路讲解3、代码实现 二、反转链表1、题目介绍2、思路讲解3、代码实现 三、相交链表1、题目介绍2、思路讲解3、代码实现 四、链表的中间结点1、题目介绍2、思路讲解3、代码实现 五、设计循环队列1、题目介绍2、思路讲解3、代码实现 六、…

酸纯化APU系统在阳极氧化酸回收中的应用

阳极氧化是一种涉及对金属(通常是铝)表面进行电化学处理的工艺&#xff0c;作为一种表面处理中常见且主要的技术&#xff0c;阳极氧化可增强其耐腐蚀性、硬度和耐磨性&#xff0c;从而提高铝合金的使用寿命和美观度。 常见的表面处理方法——阳极氧化 阳极氧化是以铝或铝合金制…

超简洁ubuntu linux 安装 cp2k

文章目录 打开下载网址解压接下来的步骤讲解 将解压的包移到对应路径下最后运行 打开下载网址 需要从github下载&#xff1a;下载网址 两个都可以从windows下先下载&#xff0c;再复制到linux中&#xff0c; 如果不能复制&#xff0c;右键这两个&#xff0c;复制链接&#xf…

C++数据结构X篇_19_排序基本概念及冒泡排序(重点是核心代码,冒泡是稳定的排序)

文章目录 1. 排序基本概念2. 冒泡排序2.1 核心代码2.2 冒泡排序代码2.3 查看冒泡排序的时间消耗2.4 冒泡排序改进版减小时间消耗 1. 排序基本概念 现实生活中排序很重要&#xff0c;例如:淘宝按条件搜索的结果展示等。 概念 排序是计算机内经常进行的一种操作&#xff0c;其目…

【Python二级-练习(详细版)】

python江湖 1、求长方形面积题目描述&#xff1a;代码如下&#xff1a; 2、随机密码验证题目描述&#xff1a;代码如下&#xff1a; 3、信息分配表&#xff08;字典&#xff09;题目描述&#xff1a;代码如下&#xff1a; 4、全模式分词&#xff08;jieba)题目描述&#xff1a;…

2023年腾讯云双11活动云服务器价格表

2023年腾讯云双11活动已经拉开了序幕&#xff0c;腾讯云推出了一系列的优惠活动&#xff0c;下面给大家分享腾讯云双11活动云服务器价格表&#xff0c;对于有需要购买云服务器的用户来说&#xff0c;无疑是一份非常有价值的参考。 一、腾讯云双十一活动入口 活动入口&#xff…

Python:实现日历功能

背景 日常生活中&#xff0c;每天都要用到日历&#xff0c;日历成为我们生活中的必需品&#xff0c;那么如何制作日历呢&#xff0c;其实方法有很多&#xff0c;可以直接在excel中制作&#xff0c;也可以手画等等。 学习过编程的朋友&#xff0c;能否想到用Python编写一…

吐血整理,Jmeter服务端性能测试-线程阻塞问题案例分析(超细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Jstack打印快照…

vue3根据数据取消el-table选中状态获取到最新数据

原始数据&#xff1a; //el-table点击复选框事件 function getSelected(selection, row){//判断是否是已选过数据 0为没有选&#xff0c;>0有选过if(initial.value>0 ){let isCheck false //是否取消 true取消 false不取消//循环判断已选的数据是否包含当前点击获取到的…

相交链表-力扣

一、题目描述 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 二、题解 注意题目所说的相交&#xff0c;相交节点不只是数值上的相等&#xff0c;而是相交以后两条链变成一条链。 解决改题目&#xff0c;我们可以&#xff1a;…

APP 专项测试之兼容性测试

1、APP 兼容性测试认识 随着 APP 应用范围越来越广&#xff0c;用户群体越来越大&#xff0c;终端设备的型号也越来越多&#xff0c;移动终端碎片化加剧&#xff0c;使得 APP 兼容性测试成为测试质量保障必须要考虑的环节。 APP 兼容性测试通常会考虑&#xff1a;操作系统、厂…

分享从零开始学习网络设备配置--任务4.2 使用IPv6静态及默认路由实现网络连通

任务描述 某公司利用IPv6技术搭建网络&#xff0c;公司3个部门所有PC机连接在同一交换机上&#xff0c;PC1代表行政部划分到VLAN10中&#xff0c;PC2代表财务部划分到VLAN20中&#xff0c;PC3代表销售部划分到VLAN30中&#xff0c;R1代表公司出口路由器&#xff0c;R2模拟Inter…