java 学习笔记 第二阶段:Java进阶
目录
多线程编程
线程的概念与生命周期
创建线程的两种方式(继承Thread类、实现Runnable接口)
线程同步与锁机制(synchronized、Lock)
线程池(ExecutorService)
线程间通信(wait、notify、notifyAll)
实践建议:编写多线程程序,模拟生产者-消费者问题。
反射机制
Class类与反射
获取类的信息(字段、方法、构造器)
动态创建对象与调用方法
实践建议:通过反射实现一个简单的依赖注入。
注解(Annotation)
内置注解(@Override、@Deprecated等)
自定义注解
元注解(@Target、@Retention等)
实践建议:自定义注解并实现简单的注解处理器。
网络编程
TCP/IP协议与Socket编程
UDP协议与DatagramSocket编程
HTTP协议与URLConnection
实践建议:编写一个简单的聊天程序。
数据库编程
JDBC简介
连接数据库(DriverManager、Connection)
执行SQL语句(Statement、PreparedStatement)
事务管理
数据库连接池(DBCP、C3P0、HikariCP)
-
多线程编程
-
线程的概念与生命周期
// 1. 线程的概念与生命周期// 线程是程序执行的最小单位,一个程序可以有多个线程。 // 线程有以下几种状态: // - NEW: 新建状态,线程已经创建但尚未开始执行。 // - RUNNABLE: 运行状态,线程正在运行或等待被调度执行。 // - BLOCKED: 阻塞状态,线程因等待锁而被阻塞。 // - WAITING: 等待状态,线程正在等待其他线程的通知。 // - TIMED_WAITING: 超时等待状态,线程正在等待超时。 // - TERMINATED: 终止状态,线程执行完成或者异常终止。// 示例:线程状态的转换 public class ThreadLifeCycle {public static void main(String[] args) {Thread thread = new Thread(() -> {System.out.println("Thread is running...");});System.out.println("Thread state: " + thread.getState()); // NEW 状态thread.start();System.out.println("Thread state: " + thread.getState()); // RUNNABLE 状态} } -
创建线程的两种方式(继承Thread类、实现Runnable接口)
// 2. 创建线程的两种方式// (1)继承 Thread 类 class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread is running using Thread class!");} }public class ThreadExample {public static void main(String[] args) {// 创建并启动线程MyThread myThread = new MyThread();myThread.start(); // 调用 start() 方法启动线程} }// (2)实现 Runnable 接口 class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Thread is running using Runnable interface!");} }public class RunnableExample {public static void main(String[] args) {// 创建线程Thread thread = new Thread(new MyRunnable());thread.start(); // 调用 start() 方法启动线程} } -
线程同步与锁机制(synchronized、Lock)
// 3. 线程同步与锁机制// 线程同步:避免多个线程同时访问共享资源导致数据不一致的问题。 // (1)使用 synchronized 关键字进行同步 class Counter {private int count = 0;// 使用 synchronized 确保线程安全public synchronized void increment() {count++;}public int getCount() {return count;} }public class SynchronizedExample {public static void main(String[] args) throws InterruptedException {Counter counter = new Counter();// 创建两个线程并启动Thread thread1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {counter.increment();}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {counter.increment();}});thread1.start();thread2.start();thread1.join();thread2.join();System.out.println("Final count: " + counter.getCount()); // 输出结果应该是 2000} }// (2)使用 Lock 进行同步 import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;class LockCounter {private int count = 0;private Lock lock = new ReentrantLock();public void increment() {lock.lock(); // 获取锁try {count++;} finally {lock.unlock(); // 释放锁}}public int getCount() {return count;} }public class LockExample {public static void main(String[] args) throws InterruptedException {LockCounter counter = new LockCounter();// 创建两个线程并启动Thread thread1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {counter.increment();}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {counter.increment();}});thread1.start();thread2.start();thread1.join();thread2.join();System.out.println("Final count using Lock: " + counter.getCount()); // 输出结果应该是 2000} } -
线程池(ExecutorService)
// 4. 线程池(ExecutorService)// 使用线程池来管理线程,避免频繁的创建与销毁线程。 // ExecutorService 是一个接口,提供了用于创建线程池和提交任务的方法。import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class ThreadPoolExample {public static void main(String[] args) {// 创建一个固定大小的线程池ExecutorService executorService = Executors.newFixedThreadPool(2);// 提交任务executorService.submit(() -> System.out.println("Task 1 is executed"));executorService.submit(() -> System.out.println("Task 2 is executed"));// 关闭线程池executorService.shutdown();} } -
线程间通信(wait、notify、notifyAll)
// 5. 线程间通信(wait、notify、notifyAll)// 使用线程间通信来协调多个线程的执行顺序。 // - wait():使当前线程进入等待状态,并释放锁。 // - notify():唤醒等待队列中的一个线程。 // - notifyAll():唤醒等待队列中的所有线程。class SharedResource {private int count = 0;// 使用 wait 和 notify 进行线程间通信public synchronized void produce() throws InterruptedException {while (count >= 1) {wait(); // 如果资源已满,当前线程等待}count++;System.out.println("Produced, count: " + count);notify(); // 通知消费者}public synchronized void consume() throws InterruptedException {while (count <= 0) {wait(); // 如果资源为空,当前线程等待}count--;System.out.println("Consumed, count: " + count);notify(); // 通知生产者} }public class ProducerConsumerExample {public static void main(String[] args) throws InterruptedException {SharedResource resource = new SharedResource();// 创建并启动生产者线程Thread producer = new Thread(() -> {try {for (int i = 0; i < 5; i++) {resource.produce();}} catch (InterruptedException e) {e.printStackTrace();}});// 创建并启动消费者线程Thread consumer = new Thread(() -> {try {for (int i = 0; i < 5; i++) {resource.consume();}} catch (InterruptedException e) {e.printStackTrace();}});producer.start();consumer.start();producer.join();consumer.join();} } -
实践建议:编写多线程程序,模拟生产者-消费者问题。
-
-
反射机制
-
Class类与反射
<反射机制是 Java 提供的一个强大特性,它允许在运行时动态地查询和操作类的结构(如字段、方法、构造器等),以及动态创建对象和调用方法。// 1. Class类与反射// 在 Java 中,`Class` 是一个类,用于描述一个类的信息, // 每个类在 JVM 中都有一个与之对应的 `Class` 对象,通过该对象可以获取类的各种信息。 // 获取 `Class` 对象的方式有几种:// (1)使用 `getClass()` 方法 Object obj = new String("Hello"); Class<?> clazz1 = obj.getClass(); // 获取对象的 Class 对象 System.out.println(clazz1.getName()); // 输出类的全限定名:java.lang.String// (2)使用 `Class.forName()` 方法 Class<?> clazz2 = Class.forName("java.lang.String"); // 通过类名获取 Class 对象 System.out.println(clazz2.getName()); // 输出类的全限定名:java.lang.String// (3)使用 `.class` 语法 Class<?> clazz3 = String.class; // 获取 String 类的 Class 对象 System.out.println(clazz3.getName()); // 输出类的全限定名:java.lang.String
-
相关文章:
java 学习笔记 第二阶段:Java进阶
目录 多线程编程 线程的概念与生命周期 创建线程的两种方式(继承Thread类、实现Runnable接口) 线程同步与锁机制(synchronized、Lock) 线程池(ExecutorService) 线程间通信(wait、notify、notifyAll) 实践建议:编写多线程程序,模拟生产者-消费者问题。 反射机…...
机组存储系统
局部性 理论 程序执行,会不均匀访问主存,有些被频繁访问,有些很少被访问 时间局部性 被用到指令,不久可能又被用到 产生原因是大量循环操作 空间局部性 某个数据和指令被使用,附近数据也可能使用 主要原因是顺序存…...
【基础工程搭建】内存访问异常问题分析
前言 汽车电子嵌入式开始更新全新的AUTOSAR项目实战专栏内容,从0到1搭建一个AUTOSAR工程,内容会覆盖AUTOSAR通信协议栈、存储协议栈、诊断协议栈、MCAL、系统服务、标定、Bootloader、复杂驱动、功能安全等所有常见功能和模块,全网同步更新开发设计文档(后期也会更新视频内…...
Mysql 和 navicat 的使用
初识navicat 点开navicat,然后点击连接选择mysql连接,输入密码(一般都是123456)即可进行连接mysql 可以看见mysql中有如下已经建立好的数据库,是我之前已经建立过的数据库,其中test就是我之前建立的数据库…...
计算机网络(五)运输层
5.1、运输层概述 概念 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时…...
托宾效应和托宾q理论。简单解释
托宾效应和托宾q理论 托宾效应(Tobin Effect)和托宾q理论(Tobins q Theory)都是由美国经济学家詹姆斯托宾(James Tobin)提出的,它们在宏观经济学和金融经济学中占有重要地位。 托宾效应 托宾…...
大数据原生集群 (Hadoop3.X为核心) 本地测试环境搭建二
本篇安装软件版本 mysql5.6 spark3.2.1-hadoop3.2 presto0.272 zeppelin0.11.2 kafka_2.13_3.7.2 mysql 安装步骤见-》 https://blog.csdn.net/dudadudadd/article/details/110874570 spark 安装步骤见-》https://blog.csdn.net/dudadudadd/article/details/109719624 安装…...
ClickHouse vs StarRocks 选型对比
一、面向列存的 DBMS 新的选择 Hadoop 从诞生已经十三年了,Hadoop 的供应商争先恐后的为 Hadoop 贡献各种开源插件,发明各种的解决方案技术栈,一方面确实帮助很多用户解决了问题,但另一方面因为繁杂的技术栈与高昂的维护成本&…...
04.计算机体系三层结构与优化(操作系统、计算机网络、)
3.计算机体系三层结构与优化(day04) 3.1 操作系统 内容概要: 操作系统的发展史:批处理系统》分时操作系统》unix>linux多道技术》(进程、线程)并发进程与线程相关概念任务运行的三种状态:…...
UML系列之Rational Rose笔记八:类图
一、新建类图 首先依旧是新建要绘制的类图;选择class diagram; 修改命名; 二、工作台介绍 正常主要就是使用到class还有直接关联箭头就行; 如果不要求规范,直接新建一些需要的类,然后写好关系即可&#…...
Pycharm 使用教程
一、基本配置 1. 切换Python解释器 pycharm切换解释器版本 2. pycharm虚拟环境配置 虚拟环境的目的:创建适用于该项目的环境,与系统环境隔离,防止污染系统环境(包括需要的库)虚拟环境配置存放在项目根目录下的 ven…...
pycharm+pyside6+desinger实现查询汉字笔顺GIF动图
一、引言 这学期儿子语文期末考试有一道这样的题目: 这道题答案是B,儿子做错了选了C。我告诉他“车字旁”和“车”的笔顺是不一样的,因为二者有一个笔画是不一样的,“车字旁”下边那笔是“提”,而“车”字是“横”&am…...
vue3学习-day5
provide $ inject 跨层传递普通数据 跨层传递响应式数据 跨层传递方法 需求解决思考 总结 Vue3.3新特性-defineOptions Vue3.3新特性-defineModel...
SpringData-Redis缓存之RedisTemplate
一、概述 大多数用户可能会使用RedisTemplate及其相应的包org.springframework.data.redis.core或其反应式变体ReactiveRedisTemplate。由于其丰富的功能集,该模板实际上是Redis模块的中心类。该模板为Redis交互提供了高级抽象。虽然[Reactive]RedisConnection提供…...
第423场周赛:检测相邻递增子数组 Ⅰ、检测相邻递增子数组 Ⅱ、好子序列的元素之和、统计小于 N 的 K 可约简整数
Q1、检测相邻递增子数组 Ⅰ 1、题目描述 给你一个由 n 个整数组成的数组 nums 和一个整数 k,请你确定是否存在 两个 相邻 且长度为 k 的 严格递增 子数组。具体来说,需要检查是否存在从下标 a 和 b (a < b) 开始的 两个 子数组,并满足下…...
hive知识体系
hive知识体系 hive知识体系 链接: 1Hive概览 链接: 2Hive表类型 链接: 3Hive数据抽样 链接: 4Hive计算引擎 链接: 5Hive存储与压缩 链接: 6Hive Sql 大全 链接: 6Hive Sql 大全-Hive 函数 链接: 6Hive Sql 大全-窗口函数 链接: 7Hive执行计划 链接: 8Hive SQL底层执行原理 链接…...
第三篇 Avaya IP Office的架构及其服务组成
所谓的架构,其实就是Solution,解决方案。一般就是如下几套: IPO primary IPO secondaryIPO primary IP500v2IPO primary IPO secondary IP500v2IPO primary IPO secondary IP500v2 Expansion Server(IP500v2,扩展)IPO primaryIPO 500v2 简单的解释…...
AUTOSAR EcuM(ECU状态管理器)
EcuM管理的ECU状态特指ECU的上下电状态。EcuM有两种EcuMFixed和EcuMFlex,其中EcuMFlex是在 AUTOSAR4.x 之后新增的规范文件,相应地原来的 EcuM 改称为 EcuMFixed。EcuMFlex主要是为了适应不同应用场景的各种不同需求,实现更加灵活的处理。所以…...
【PyQt】如何在mainwindow中添加菜单栏
[toc]如何在mainwindow中添加菜单栏 如何在mainwindow中添加菜单栏 主要有两种方法: 1.直接创建mainwindow进行添加 2.使用ui文件加载添加 第二种方法更为常见,可以应用到实际 1.直接创建mainwindow进行添加 import sysfrom PyQt5.QtWidgets import …...
浅谈云计算01 | 云计算服务的特点
在当今数字化时代,云计算作为一种强大的技术解决方案,正逐渐改变着企业和个人对信息技术的使用方式。本文将详细探讨云计算的五个主要特点,包括按需自助服务、广泛的网络接入、资源池化、快速弹性伸缩以及可计量服务。 一、按需自助服务 云…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...
