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

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. 多线程编程

    1. 线程的概念与生命周期

      // 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 状态}
      }
    2. 创建线程的两种方式(继承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() 方法启动线程}
      }
    3. 线程同步与锁机制(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}
      }

    4. 线程池(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();}
      }

    5. 线程间通信(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();}
      }
    6. 实践建议:编写多线程程序,模拟生产者-消费者问题。

  2. 反射机制

    1. 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) 实践建议:编写多线程程序,模拟生产者-消费者问题。 反射机…...

机组存储系统

局部性 理论 程序执行&#xff0c;会不均匀访问主存&#xff0c;有些被频繁访问&#xff0c;有些很少被访问 时间局部性 被用到指令&#xff0c;不久可能又被用到 产生原因是大量循环操作 空间局部性 某个数据和指令被使用&#xff0c;附近数据也可能使用 主要原因是顺序存…...

【基础工程搭建】内存访问异常问题分析

前言 汽车电子嵌入式开始更新全新的AUTOSAR项目实战专栏内容,从0到1搭建一个AUTOSAR工程,内容会覆盖AUTOSAR通信协议栈、存储协议栈、诊断协议栈、MCAL、系统服务、标定、Bootloader、复杂驱动、功能安全等所有常见功能和模块,全网同步更新开发设计文档(后期也会更新视频内…...

Mysql 和 navicat 的使用

初识navicat 点开navicat&#xff0c;然后点击连接选择mysql连接&#xff0c;输入密码&#xff08;一般都是123456&#xff09;即可进行连接mysql 可以看见mysql中有如下已经建立好的数据库&#xff0c;是我之前已经建立过的数据库&#xff0c;其中test就是我之前建立的数据库…...

计算机网络(五)运输层

5.1、运输层概述 概念 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时…...

托宾效应和托宾q理论。简单解释

托宾效应和托宾q理论 托宾效应&#xff08;Tobin Effect&#xff09;和托宾q理论&#xff08;Tobins q Theory&#xff09;都是由美国经济学家詹姆斯托宾&#xff08;James Tobin&#xff09;提出的&#xff0c;它们在宏观经济学和金融经济学中占有重要地位。 托宾效应 托宾…...

大数据原生集群 (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 从诞生已经十三年了&#xff0c;Hadoop 的供应商争先恐后的为 Hadoop 贡献各种开源插件&#xff0c;发明各种的解决方案技术栈&#xff0c;一方面确实帮助很多用户解决了问题&#xff0c;但另一方面因为繁杂的技术栈与高昂的维护成本&…...

04.计算机体系三层结构与优化(操作系统、计算机网络、)

3.计算机体系三层结构与优化&#xff08;day04&#xff09; 3.1 操作系统 内容概要&#xff1a; 操作系统的发展史&#xff1a;批处理系统》分时操作系统》unix>linux多道技术》&#xff08;进程、线程&#xff09;并发进程与线程相关概念任务运行的三种状态&#xff1a;…...

UML系列之Rational Rose笔记八:类图

一、新建类图 首先依旧是新建要绘制的类图&#xff1b;选择class diagram&#xff1b; 修改命名&#xff1b; 二、工作台介绍 正常主要就是使用到class还有直接关联箭头就行&#xff1b; 如果不要求规范&#xff0c;直接新建一些需要的类&#xff0c;然后写好关系即可&#…...

Pycharm 使用教程

一、基本配置 1. 切换Python解释器 pycharm切换解释器版本 2. pycharm虚拟环境配置 虚拟环境的目的&#xff1a;创建适用于该项目的环境&#xff0c;与系统环境隔离&#xff0c;防止污染系统环境&#xff08;包括需要的库&#xff09;虚拟环境配置存放在项目根目录下的 ven…...

pycharm+pyside6+desinger实现查询汉字笔顺GIF动图

一、引言 这学期儿子语文期末考试有一道这样的题目&#xff1a; 这道题答案是B&#xff0c;儿子做错了选了C。我告诉他“车字旁”和“车”的笔顺是不一样的&#xff0c;因为二者有一个笔画是不一样的&#xff0c;“车字旁”下边那笔是“提”&#xff0c;而“车”字是“横”&am…...

vue3学习-day5

provide $ inject 跨层传递普通数据 跨层传递响应式数据 跨层传递方法 需求解决思考 总结 Vue3.3新特性-defineOptions Vue3.3新特性-defineModel...

SpringData-Redis缓存之RedisTemplate

一、概述 大多数用户可能会使用RedisTemplate及其相应的包org.springframework.data.redis.core或其反应式变体ReactiveRedisTemplate。由于其丰富的功能集&#xff0c;该模板实际上是Redis模块的中心类。该模板为Redis交互提供了高级抽象。虽然[Reactive]RedisConnection提供…...

第423场周赛:检测相邻递增子数组 Ⅰ、检测相邻递增子数组 Ⅱ、好子序列的元素之和、统计小于 N 的 K 可约简整数

Q1、检测相邻递增子数组 Ⅰ 1、题目描述 给你一个由 n 个整数组成的数组 nums 和一个整数 k&#xff0c;请你确定是否存在 两个 相邻 且长度为 k 的 严格递增 子数组。具体来说&#xff0c;需要检查是否存在从下标 a 和 b (a < b) 开始的 两个 子数组&#xff0c;并满足下…...

hive知识体系

hive知识体系 hive知识体系 链接: 1Hive概览 链接: 2Hive表类型 链接: 3Hive数据抽样 链接: 4Hive计算引擎 链接: 5Hive存储与压缩 链接: 6Hive Sql 大全 链接: 6Hive Sql 大全-Hive 函数 链接: 6Hive Sql 大全-窗口函数 链接: 7Hive执行计划 链接: 8Hive SQL底层执行原理 链接…...

第三篇 Avaya IP Office的架构及其服务组成

所谓的架构&#xff0c;其实就是Solution,解决方案。一般就是如下几套&#xff1a; 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&#xff0c;其中EcuMFlex是在 AUTOSAR4.x 之后新增的规范文件&#xff0c;相应地原来的 EcuM 改称为 EcuMFixed。EcuMFlex主要是为了适应不同应用场景的各种不同需求&#xff0c;实现更加灵活的处理。所以…...

【PyQt】如何在mainwindow中添加菜单栏

[toc]如何在mainwindow中添加菜单栏 如何在mainwindow中添加菜单栏 主要有两种方法&#xff1a; 1.直接创建mainwindow进行添加 2.使用ui文件加载添加 第二种方法更为常见&#xff0c;可以应用到实际 1.直接创建mainwindow进行添加 import sysfrom PyQt5.QtWidgets import …...

浅谈云计算01 | 云计算服务的特点

在当今数字化时代&#xff0c;云计算作为一种强大的技术解决方案&#xff0c;正逐渐改变着企业和个人对信息技术的使用方式。本文将详细探讨云计算的五个主要特点&#xff0c;包括按需自助服务、广泛的网络接入、资源池化、快速弹性伸缩以及可计量服务。 一、按需自助服务 云…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

java+webstock

maven依赖 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.apache.tomcat.websocket</groupId&…...

HTML版英语学习系统

HTML版英语学习系统 这是一个完全免费、无需安装、功能完整的英语学习工具&#xff0c;使用HTML CSS JavaScript实现。 功能 文本朗读练习 - 输入英文文章&#xff0c;系统朗读帮助练习听力和发音&#xff0c;适合跟读练习&#xff0c;模仿学习&#xff1b;实时词典查询 - 双…...

NineData数据库DevOps功能全面支持百度智能云向量数据库 VectorDB,助力企业 AI 应用高效落地

NineData 的数据库 DevOps 解决方案已完成对百度智能云向量数据库 VectorDB 的全链路适配&#xff0c;成为国内首批提供 VectorDB 原生操作能力的服务商。此次合作聚焦 AI 开发核心场景&#xff0c;通过标准化 SQL 工作台与细粒度权限管控两大能力&#xff0c;助力企业安全高效…...

WEB3全栈开发——面试专业技能点P8DevOps / 区块链部署

一、Hardhat / Foundry 进行合约部署 概念介绍 Hardhat 和 Foundry 都是以太坊智能合约开发的工具套件&#xff0c;支持合约的编译、测试和部署。 它们允许开发者在本地或测试网络快速开发智能合约&#xff0c;并部署到链上&#xff08;测试网或主网&#xff09;。 部署过程…...