当前位置: 首页 > news >正文

Java线程的异常处理:确保线程安全运行

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在上一期文章中,我们探讨了Java线程间的协作与竞争,详细介绍了wait()notify()和线程调度的机制。然而,实际的多线程开发中,一个更为常见的问题是如何在多线程环境下处理异常。线程执行过程中遇到的未处理异常可能会导致应用程序出现不可预期的行为,甚至崩溃。因此,理解Java线程中的异常处理机制是保障程序稳健运行的重要步骤。

本期内容将深入探讨如何在Java中安全处理线程的异常情况,确保多线程程序的健壮性和可维护性。

摘要

Java的多线程编程提供了强大的并发处理能力,但在此过程中处理异常往往容易被忽视。由于线程是独立的执行单元,一旦某个线程发生异常,可能不会立即影响主线程或其他线程的执行。因此,掌握如何捕获并处理线程异常是保障并发程序安全和可靠的重要技能。

本文将从线程异常处理的原理入手,分析常见的错误场景,介绍几种有效的异常处理方法,并通过实际代码演示如何确保线程安全运行。

概述

Java提供了丰富的多线程支持,通常通过实现Runnable接口或继承Thread类来创建并启动线程。然而,在并发环境中,线程中的异常不会被默认传播到主线程,因而导致的错误可能较难发现。我们需要通过特定的机制来捕获线程中的异常,从而保证系统的稳健性。

本篇将涵盖以下内容:

  1. 线程异常的常见问题
  2. Thread.UncaughtExceptionHandler机制的使用
  3. 如何在线程池中处理异常
  4. 实战代码演示:确保线程的异常处理

源码解析

1. 常见的线程异常问题

当线程在运行过程中抛出未捕获的异常时,它不会影响其他线程或主线程的运行。但它可能导致该线程意外终止,影响并发任务的完成。例如:

public class SimpleThreadExceptionDemo {public static void main(String[] args) {Thread thread = new Thread(() -> {throw new RuntimeException("Thread exception!");});thread.start();System.out.println("Main thread is running");}
}

在这个例子中,RuntimeException在子线程中被抛出,而主线程仍然继续运行,输出“Main thread is running”。这个异常没有被任何地方捕获,也不会传递给主线程,这种情况在实际开发中容易被忽视。

2. 使用Thread.UncaughtExceptionHandler处理线程异常

为了解决这种问题,Java提供了Thread.UncaughtExceptionHandler接口,用于处理线程中未捕获的异常。

public class ThreadExceptionHandlerDemo {public static void main(String[] args) {Thread thread = new Thread(() -> {throw new RuntimeException("Thread exception!");});thread.setUncaughtExceptionHandler((t, e) -> {System.out.println("Exception in thread: " + t.getName() + ", Error: " + e.getMessage());});thread.start();}
}

在这个例子中,我们为线程设置了一个UncaughtExceptionHandler,一旦线程抛出未捕获的异常,它将捕获该异常并处理。

3. 在线程池中处理异常

在线程池(如ExecutorService)中,异常处理的机制稍有不同。线程池中的任务通常不会主动传播异常,除非我们通过某种方式捕获并处理它们。可以使用Future来获取任务的执行结果,并通过捕获其抛出的异常来处理:

import java.util.concurrent.*;public class ThreadPoolExceptionDemo {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(2);Future<?> future = executor.submit(() -> {throw new RuntimeException("Task exception!");});try {future.get(); // 这里捕获异常} catch (InterruptedException | ExecutionException e) {System.out.println("Caught exception: " + e.getCause());}executor.shutdown();}
}

通过Future.get()方法,可以捕获线程池中任务抛出的异常,并处理异常逻辑。

使用案例分享

实际案例:文件处理的多线程任务

假设我们有一个文件处理任务,需要处理大量文件,而每个文件的处理可能因为IO异常或文件格式问题抛出异常。我们可以通过线程池并发执行任务,并确保在发生异常时进行合理处理。

import java.io.File;
import java.util.concurrent.*;public class FileProcessingTask implements Callable<String> {private File file;public FileProcessingTask(File file) {this.file = file;}@Overridepublic String call() throws Exception {if (!file.exists()) {throw new RuntimeException("File not found: " + file.getName());}// 模拟文件处理逻辑return "Processed " + file.getName();}
}public class FileProcessingMain {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(3);Future<String> future = executor.submit(new FileProcessingTask(new File("test.txt")));try {String result = future.get();System.out.println(result);} catch (InterruptedException | ExecutionException e) {System.out.println("Exception occurred: " + e.getCause().getMessage());} finally {executor.shutdown();}}
}

应用场景案例

在金融、物流、电商等系统中,任务通常被分解为多个并发执行的操作。比如,订单系统中的订单处理、支付流程、库存更新等操作通常需要并发处理。在这些场景中,一旦发生异常,必须确保异常得到及时处理和记录,以防止业务流程中断。

优缺点分析

优点:

  • 提高系统健壮性:通过捕获和处理线程中的异常,避免因异常导致整个系统的不稳定性。
  • 提升开发效率:通过良好的异常处理机制,可以更容易调试和定位线程中的问题。

缺点:

  • 增加复杂度:过多的异常处理逻辑可能会导致代码变得冗长,增加维护难度。
  • 隐蔽性问题:在复杂的线程池和并发场景中,如果异常处理不当,可能会掩盖一些严重的问题。

核心类方法介绍

  • Thread.setUncaughtExceptionHandler(UncaughtExceptionHandler handler): 设置线程的异常处理器。
  • Future.get(): 在调用时捕获线程池任务抛出的异常。
  • Callable.call(): 可抛出异常的任务接口,实现任务时可以抛出检查异常。

测试用例

测试代码

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertThrows;public class ThreadExceptionTest {@Testpublic void testThreadExceptionHandling() {Thread thread = new Thread(() -> {throw new RuntimeException("Test Exception");});thread.setUncaughtExceptionHandler((t, e) -> {System.out.println("Exception: " + e.getMessage());});thread.start();// 验证线程抛出的异常被处理assertThrows(RuntimeException.class, () -> {thread.join();});}
}

测试代码分析

针对如上示例代码,这里我给大家详细的代码剖析下,以便于帮助大家理解的更为透彻,帮助大家早日掌握。在这个测试用例中,我们演示了如何在Java中处理线程抛出的异常。以下是对代码的详细解析:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertThrows;public class ThreadExceptionTest {@Testpublic void testThreadExceptionHandling() {Thread thread = new Thread(() -> {throw new RuntimeException("Test Exception");});thread.setUncaughtExceptionHandler((t, e) -> {System.out.println("Exception: " + e.getMessage());});thread.start();// 验证线程抛出的异常被处理assertThrows(RuntimeException.class, () -> {thread.join();});}
}
1. 创建线程并抛出异常
Thread thread = new Thread(() -> {throw new RuntimeException("Test Exception");
});

我们创建了一个新的线程,并在该线程中直接抛出了一个RuntimeException,其消息为“Test Exception”。这个异常会在线程运行时被抛出。

2. 设置异常处理器
thread.setUncaughtExceptionHandler((t, e) -> {System.out.println("Exception: " + e.getMessage());
});

我们为线程设置了一个UncaughtExceptionHandler,它的作用是捕获线程中未处理的异常。当线程抛出未捕获的异常时,UncaughtExceptionHandler会处理这些异常。在这里,我们只是将异常消息打印到控制台。

3. 启动线程
thread.start();

我们启动了线程,使其开始执行。

4. 验证异常处理
assertThrows(RuntimeException.class, () -> {thread.join();
});

我们使用assertThrows来验证异常是否被正确处理。assertThrows用于检查在执行thread.join()时是否抛出了指定类型的异常。在这个测试中,thread.join()会等待线程结束,虽然join()方法本身不会抛出异常,但我们在这里测试线程是否被正确处理。

说明
  • 异常处理器的作用:通过设置UncaughtExceptionHandler,我们确保了即使线程内部抛出异常,也能有专门的处理机制进行响应。这样可以避免未捕获异常导致的程序崩溃。
  • assertThrows的作用assertThrows用于检查在某个操作过程中是否抛出了预期的异常。在本例中,它用于确保线程异常得到了处理。
小结

这段代码演示了如何在Java中为线程设置异常处理器,确保线程抛出的异常能被捕获并处理。通过这种方式,我们可以在多线程环境中更好地控制异常,从而提高程序的稳定性和健壮性。

总结

在多线程编程中,异常处理是保证线程安全和程序稳定性的关键部分。通过使用UncaughtExceptionHandler,可以有效捕获和处理线程中发生的未捕获异常。结合适当的测试用例,我们可以确保异常处理机制的有效性,进而保障整个系统的健壮性。

小结

Java的多线程异常处理是确保并发程序稳定性的重要工具。通过使用UncaughtExceptionHandler、线程池中的FutureCallable接口等机制,开发者可以有效处理线程中的异常问题,确保多线程任务的安全执行。

总结

通过本文的介绍,我们详细了解了如何在Java的多线程环境下处理异常。合理的异常处理机制不仅能提高程序的稳定性,还能帮助开发者更快地定位问题。在多线程开发中,提前设计并考虑好异常处理逻辑,是保障系统健壮性的重要一步。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

相关文章:

Java线程的异常处理:确保线程安全运行

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云/阿里云/华为云/51CTO&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互…...

vite5.x配置https

旧版的vite直接在config里面配置https&#xff1a;true即可&#xff0c;新版的麻烦一些。 1.准备工作 需要安装openssl 下载地址&#xff1a;Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 找到合适的版本安装&#xff0c;配置好环境变量&#x…...

地下苹果(马铃薯)怎么破局?

地下苹果&#xff08;马铃薯&#xff09;怎么破局&#xff1f; 原创萨辣米哎青年杂说youth 地下苹果&#xff08;马铃薯&#xff09;怎么破局&#xff1f;https://mp.weixin.qq.com/s/zU-9pnVWxDn72D6yx5CViA 1.前言 马铃薯是重要的粮菜兼用和工业原料作物&#xff0c;由于其…...

ceph fs status 输出详解

ceph fs status 命令用于显示 Ceph 文件系统的状态信息&#xff0c;其中各列的含义如下&#xff1a; RANK&#xff1a;元数据服务器&#xff08;MDS&#xff09;的等级或标识符。 STATE&#xff1a;MDS 的当前状态&#xff0c;例如 active&#xff08;活跃&#xff09;、stan…...

phpenc加密程序源码

免费扩展加密程序&#xff0c;类似于sg11加密&#xff0c;支持单个PHP&#xff08;免费&#xff09;文件以及批量PHP文件&#xff08;ZIP压缩包格式&#xff09;源码加密的保护平台&#xff0c;加密后的源码文件保持原有代码结构&#xff0c;可以跨平台运行&#xff0c;可以运行…...

深入探秘 ZooKeeper:架构、设计、角色与 ZNode 全解析 前言

1.ZooKeeper 分布式锁怎么实现的&#xff1f; ZooKeeper 是一个高效的分布式协调服务&#xff0c;常用于实现分布式系统中的配置管理、命名服务、分布式锁等。下面简要介绍如何使用 ZooKeeper 实现分布式锁。 分布式锁的特性 在讨论如何实现之前&#xff0c;先了解分布式锁应…...

计算机图形学【绘制立方体和正六边形】

工具介绍 OpenGL&#xff1a;一个跨语言的图形API&#xff0c;用于渲染2D和3D图形。它提供了绘制图形所需的底层功能。 GLUT&#xff1a;OpenGL的一个工具库&#xff0c;简化了窗口创建、输入处理和其他与图形环境相关的任务。 使用的函数 1. glClear(GL_COLOR_BUFFER_BIT |…...

日志模块和Plus模块升级以及问题修复

文章目录 1.common-log4j2-starter1.目录2.LogAspectProperties.java 日志切面配置3.TraceProperties.java 链路追踪配置4.Log4j2AutoConfiguration.java 条件注入链路追踪过滤器 2.common-mybatis-plus-starter1.目录2.引入依赖3.SqlBeautyProperties.java 读取sql.beauty相关…...

【Bug】报错信息:Required request body is missing(包含五种详细解决方案)

大家好&#xff0c;我是摇光~ 遇到“Required request body is missing”错误通常意味着服务器期望在HTTP请求中包含一个请求体&#xff08;body&#xff09;&#xff0c;但是实际上并没有收到。 例如&#xff1a; 当你在使用网页或应用程序的后台&#xff08;比如一个网站或手…...

Ceph分布式存储集群,不仅仅是一个简单的对象存储解决方案

Ceph 作为 OpenStack 的存储后端 块存储&#xff08;Cinder 后端&#xff09; Ceph 的 RBD&#xff08;RADOS Block Device&#xff09;模块作为 OpenStack Cinder 服务的后端&#xff0c;为虚拟机提供块级别的存储资源。RBD 支持快照、克隆和恢复等功能&#xff0c;能够满足虚…...

6.business english--updates

能够运用一系列表达方式来提供和接收最新情况&#xff0c;并讨论后续行动事项。 be able to use a range of expression to give and receive updates and to discuss follow-up action items in a typical week 在平常的一周里 The company promises that the quality will …...

Lianwei 安全周报|2024.1.7

以下是本周「Lianwei周报」&#xff0c;我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件&#xff0c;保证大家不错过本周的每一个重点&#xff01; 政策/标准/指南最新动态 01 国家发改委等三部门印发《国家数据基础设施建设指引》 国家数据基础设施是从数据…...

加速科技荣获“浙江省企业研究院”认定

近日&#xff0c;浙江省经济和信息化厅公布“2024年认定&#xff08;备案&#xff09;省级企业研发机构名单”。经过多轮严格评审和公示&#xff0c;加速科技荣获“省企业研究院”认定。这是加速科技继获国家级专精特新“小巨人”企业认定荣誉后的又一里程碑。 “浙江省企业研究…...

嵌入式C语言:什么是指针?

目录 一、指针的基本概念 1.1. 定义指针 1.2. 赋值给指针 1.3. 解引用指针 1.4. 指针运算 1.5. 空指针 1.6. 函数参数 1.7. 数组和指针 1.8. 示例代码 二、指针在内存中的表示 2.1. 内存地址存储 2.2. 内存模型 2.3. 指针与硬件交互 2.4. 示例代码 三 、指针的重…...

Python 管理 GitHub Secrets 和 Workflows

在现代软件开发中,自动化配置管理变得越来越重要。本文将介绍如何使用 Python 脚本来管理 GitHub 仓库的 Secrets 和 Workflows,这对于需要频繁更新配置或管理多个仓库的团队来说尤为有用。我们将分三个部分进行讨论:设置 GitHub 权限、创建 GitHub Secret 和创建 GitHub Wo…...

wireshark排除私接小路由

1.wireshark打开&#xff0c;发现了可疑地址&#xff0c;合法的地址段DHCP是192.168.100.0段的&#xff0c;打开后查看发现可疑地址段&#xff0c;分别是&#xff0c;192.168.0.1 192.168.1.174 192.168.1.1。查找到它对应的MAC地址。 ip.src192.168.1.1 2.通过show fdb p…...

Vue3初学之Element-plus

用于快速的上手开发&#xff0c;以做项目为导向&#xff0c;所以借用element-plus插件 发现淘宝的镜像有时候也是很慢的&#xff0c;还可以换个 npm config set registry https://registry.npmmirror.com 安装element-plus npm install element-plus --save 查看安装是否成…...

day06_Spark SQL

文章目录 day06_Spark SQL课程笔记一、今日课程内容二、DataFrame详解&#xff08;掌握&#xff09;5.清洗相关的API6.Spark SQL的Shuffle分区设置7.数据写出操作写出到文件写出到数据库 三、Spark SQL的综合案例&#xff08;掌握&#xff09;1、常见DSL代码整理2、电影分析案例…...

苍穹外卖07——来单提醒和客户催单(涉及SpringTask、WebSocket协议、苍穹外卖跳过微信支付同时保证可以收到订单功能)

Spring Task介绍 应用场景&#xff1a; 信用卡每月还款提醒银行贷款每月还款提醒火车票销售系统处理未付款订单入职纪念日为用户发送通知 cron表达式 cron表达式其实就是一个字符串&#xff0c;通过cron表达式可以定义任务触发的时间。 构成规则&#xff1a;分为6或7个域&…...

IDEA的常用设置

目录 一、显示顶部工具栏 二、设置编辑区字体按住鼠标滚轮变大变小&#xff08;看需要设置&#xff09; 三、设置自动导包和优化导入的包&#xff08;有的时候还是需要手动导包&#xff09; 四、设置导入同一个包下的类&#xff0c;超过指定个数的时候&#xff0c;合并为*&a…...

【GoLang】两个字符串如何比较大小?以及字典顺序的比较规则

在 Go 语言中&#xff0c;字符串的比较是基于字典顺序进行的。 字典顺序的比较规则&#xff1a; 比较两个字符串从左到右逐个字符的Unicode码点值&#xff0c; 若比较结果不相等则将此结果作为字符串大小的结果&#xff0c; 若比较结果相等则比较下一位&#xff0c; 若其中一个…...

3d打印材料是塑料么?pla petg

3D 打印材料不仅限于塑料&#xff0c;但塑料确实是最常见的材料类型之一。以下是一些常用的3D打印塑料材料的介绍&#xff1a; 1. PLA&#xff08;聚乳酸&#xff09; • 特点&#xff1a;可生物降解&#xff0c;环保&#xff0c;容易打印&#xff0c;表面光滑。 • 适用…...

HTML5 语义元素:网页构建的新时代

HTML5 语义元素&#xff1a;网页构建的新时代 HTML5&#xff0c;作为网页开发的新标准&#xff0c;引入了一系列语义元素&#xff0c;这些元素不仅为网页内容提供了明确的含义&#xff0c;还极大地提高了网页的可访问性和搜索引擎优化&#xff08;SEO&#xff09;效果。本文将…...

下载导出Tomcat上的excle文档,浏览器上显示下载

目录 1.前端2.Tomcat服务器内配置3.在Tomcat映射的文件内放置文件4.重启Tomcat&#xff0c;下载测试 1.前端 function downloadFile() {let pictureSourceServer "http://192.168.1.1:8080/downFile/";let fileName "测试文档.xlsx";let fileURL pictu…...

Edge浏览器内置的截长图功能

Edge浏览器内置截图功能 近年来&#xff0c;Edge浏览器不断更新和完善&#xff0c;也提供了长截图功能。在Edge中&#xff0c;只需点击右上角的“...”&#xff0c;然后选择“网页捕获”->“捕获整页”&#xff0c;即可实现长截图。这一功能的简单易用&#xff0c;使其成为…...

【测试】持续集成CI/CD

近期更新完毕&#xff0c;建议关注收藏点赞&#xff5e; 目录 概括gitJenkinspostman集成jenkins代码集成jenkins 概括 CI/CD stands for Continuous Integration and Continuous Deployment 定义 团队成果持续集成到公共平台。一天可以集成1次or多次 本地代码管理 git 远程代…...

大数据数据治理精讲

前言 首先明确&#xff0c;数据治理是一个很大的概念。 在许多与数据相关的文章中&#xff0c;我们经常能看到“数据治理”这一术语。从字面意思来看&#xff0c;它主要强调对数据进行有效管理。作为数据基础支撑工作的一部分&#xff0c;数据治理的重要性不言而喻。在日常工作…...

Spring Boot项目中增加MQTT对接

在Spring Boot项目中增加MQTT对接&#xff0c;通常涉及以下几个步骤&#xff1a; 一、搭建MQTT服务器 首先&#xff0c;你需要搭建一个MQTT服务器&#xff08;Broker&#xff09;。这可以通过多种方式实现&#xff0c;例如使用Docker来部署EMQX或Mosquitto等MQTT Broker。 以…...

Python自学 - 类进阶(迭代器)

<< 返回目录 1 Python自学 - 类进阶(迭代器) 迭代器是一个实现了 __iter__ 和 __next__ 方法的对象。实现这两个方法是Python迭代行为一种约定。   为什么要用迭代器&#xff1f;迭代器的好处是不占内存&#xff0c;它并不会像列表一样&#xff0c;把每个成员都占满。…...

FreePBX 17 on ubuntu24 with Asterisk 20

版本配置&#xff1a; FreePBX 17&#xff08;最新&#xff09; Asterisk 20&#xff08;最新Asterisk 22&#xff0c;但是FreePBX 17最新只支持Asterisk 21&#xff0c;但是21非LTS版本&#xff0c;所以选择Asterisk 20&#xff09; PHP 8.2 Maria DB (v10.11) Node J…...

SpringCloud系列教程:微服务的未来(十一)服务注册、服务发现、OpenFeign快速入门

本篇博客将通过实例演示如何在 Spring Cloud 中使用 Nacos 实现服务注册与发现&#xff0c;并使用 OpenFeign 进行服务间调用。你将学到如何搭建一个完整的微服务通信框架&#xff0c;帮助你快速开发可扩展、高效的分布式系统。 目录 前言 服务注册和发现 服务注册 ​编辑 …...

[应用类App] 轮廓线 aia源码 UI界面精美,画布实现手柄摇杆

屏幕数量&#xff1a;10个&#xff0c;仅主界面近3000代码块&#xff0c;请自行研究参考。 实现了手柄摇杆功能&#xff0c;界面做的比较好。 下载地址&#xff1a;轮廓线 aia源码 UI界面精美&#xff0c;画布实现手柄摇杆 - .aia 案例源码 - 清泛IT社区&#xff0c;为创新赋能…...

慧集通(DataLinkX)iPaaS集成平台-业务建模之业务对象(一)

通过左侧导航菜单〖业务建模〗→〖业务对象〗&#xff0c;进入该界面&#xff1b;在该界面可以查看到系统中已存在的业务对象&#xff1b; 1.新建业务对象 在DatalinkX中进入【业务建模】的【业务对象】页面&#xff0c;点击【新建】按钮进入新建页面&#xff1b; 新建页面左侧…...

uniapp 之 uni-forms校验提示【提交的字段[‘xxx‘]在数据库中并不存在】解决方案

目录 场景问题代码结果问题剖析解决方案 场景 uni-forms官方组件地址 使用uniapp官方提供的组件&#xff0c;某个表单需求&#xff0c;单位性质字段如果是高校&#xff0c;那么工作单位则是高校的下拉选择格式&#xff0c;单位性质如果是其他的类型&#xff0c;工作单位则是手动…...

JVM 触发类加载的条件有哪些?

目录 一、类加载生命周期 二、主动引用 2.1、创建类的实例 2.2、访问类的静态字段或静态方法 2.3、反射 2.4、初始化类的子类时&#xff0c;先初始化父类 2.5、虚拟机启动时&#xff0c;初始化 main 方法所在的类 2.6、动态语言支持 三、被动引用 3.1、通过子类引用父…...

01 springboot集成mybatis后密码正确但数据库连接失败

01 springboot集成mybatis后密码正确但数据库连接失败 问题描述&#xff1a; 1.datasource配置&#xff1a; //application.yaml spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mp?useUnicodetrue&characterEncodingUTF-8&autoReconnecttrue&serverTime…...

学习threejs,导入assimp assimp2json格式的模型

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.AssimpJSONLoader as…...

NLTK分词以及处理方法

在自然语言处理(NLP)的领域中,文本的处理是一个基础且核心的环节,特别是在大规模数据分析和文本挖掘中。无论是聊天机器人、情感分析,还是机器翻译,分词都是必不可少的步骤之一。分词的目的是将长篇的文本拆解为较小的单位(如单词或句子),这些单位是后续分析和处理的基…...

容器技术全面攻略:Docker的硬核玩法

文章背景 想象一下&#xff0c;一个项目终于要上线了&#xff0c;结果因为环境配置不一致&#xff0c;测试服务器一切正常&#xff0c;生产环境却宕机了。这是开发者噩梦的开始&#xff0c;也是Docker救世主角色的登场&#xff01;Docker的出现颠覆了传统环境配置的方式&#…...

什么是顶级思维?

在现代社会&#xff0c;我们常常听到“顶级思维”这个概念&#xff0c;但究竟什么才是顶级思维&#xff1f;它又是如何影响一个人的成功和幸福呢&#xff1f;今天&#xff0c;我们就来探讨一下顶级思维的几个关键要素&#xff0c;并分享一些实用的生活哲学。 1. 身体不适&…...

Chromium 132 编译指南 Windows 篇 - 配置核心环境变量 (三)

1. 引言 在之前的 Chromium 编译指南系列文章中&#xff0c;我们已经完成了编译前的准备工作以及 depot_tools 工具的安装与配置。本篇我们将聚焦于 Chromium 编译过程中至关重要的环境变量设置&#xff0c;这些配置是您顺利进行 Chromium 构建的基石。 2. 启用本地编译&…...

Linux查看服务器日志

一、tail 这个是我最常用的一种查看方式 用法如下&#xff1a; tail -n 10 test.log 查询日志尾部最后10行的日志; tail -n 10 test.log 查询10行之后的所有日志; tail -fn 10 test.log 循环实时查看最后1000行记录(最常用的)一般还会配合着grep用&#xff…...

Docker 专栏 —— Dockerfile 指令详解

文章目录 ADD 复制文件COPY 复制文件ARG 设置构建参数CMD 容器启动命令ENTRYPOINT ⼊⼝点ENV 设置环境变量EXPOSE 声明暴露的端⼝FROM 指定基础镜像LABEL 为镜像添加元数据MAINTAINER 指定维护者的信息RUN 执⾏命令USER 设置⽤户VOLUME 指定挂载点WORKDIR 指定⼯作⽬录 ADD 复制…...

IntelliJ IDEA 优化设置

针对 Java 开发&#xff0c;IntelliJ IDEA 有许多优化设置&#xff0c;可以帮助提高代码编写、调试、构建和运行的效率。以下是一些针对 Java 开发的优化建议&#xff1a; 1. 增加 JVM 内存和性能优化 增加堆内存: 通过调整 idea.vmoptions 文件&#xff0c;增加 IntelliJ ID…...

git打补丁

1、应用场景 跨仓库升级 开发项目B使用的是开源项目A。开源项目A发现漏洞&#xff0c;作者进行了修复&#xff0c;我们可以通过使用git补丁的方式&#xff0c;将作者修改的内容复制到我 们的项目B中。 2、TortoiseGit方式 源仓库 格式化补丁 根据提交数量&#xff0c;生成…...

开源CMS建站系统的安全优势有哪些?

近年来&#xff0c;用户们用开源CMS系统搭建网站的比例也越来越高&#xff0c;它为用户提供了便捷的网站建设解决方案。其中&#xff0c;亿坊CMS建站系统更因安全方面备受用户欢迎&#xff0c;下面带大家一起全面地了解一下。 一、什么是开源CMS&#xff1f; 开源CMS指的是那…...

【linux系统之redis6】redis的基础命令使用及springboot连接redis

redis的基础命令很多&#xff0c;大部分我们都可以在官网上找到&#xff0c;真的用的时候可以去官网找&#xff0c;不用全部记住这些命令 redis通用的基础命令的使用 代码测试 string类型常见的命令 key值的结构&#xff0c;可以区分不同的需求不同的业务名字 hash类型 创建…...

HDFS异构存储和存储策略

一、HDFS异构存储类型 1.1 冷、热、温、冻数据 通常&#xff0c;公司或者组织总是有相当多的历史数据占用昂贵的存储空间。典型的数据使用模式是新传入的数据被应用程序大量使用&#xff0c;从而该数据被标记为"热"数据。随着时间的推移&#xff0c;存储的数据每周…...

VSCode 使用鼠标滚轮控制字体

一、 文件 | 首选项 | 设置 二、单击在 settings.json中编辑 "editor.mouseWheelZoom": true 注注注意&#xff1a;保存哦&#xff01;ctrlS 三、测试 按住ctrl鼠标滚轮&#xff0c;控制字体大小...

全面教程:Nacos 2.4.2 启用鉴权与 MySQL 数据存储配置

全面教程&#xff1a;Nacos 2.4.2 启用鉴权与 MySQL 数据存储配置 1. 配置 Nacos 开启鉴权功能 1.1 修改 application.properties 配置文件 在 Nacos 2.4.2 中&#xff0c;开启鉴权功能需要修改 conf/application.properties 文件。按照以下方式配置&#xff1a; # 开启鉴权…...