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 | 云计算服务的特点
在当今数字化时代,云计算作为一种强大的技术解决方案,正逐渐改变着企业和个人对信息技术的使用方式。本文将详细探讨云计算的五个主要特点,包括按需自助服务、广泛的网络接入、资源池化、快速弹性伸缩以及可计量服务。 一、按需自助服务 云…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...
使用python进行图像处理—图像滤波(5)
图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值,以达到平滑(去噪)、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算,…...
