news 2026/5/16 1:17:19

Java IDEA学习之路:第十一、十二周课程笔记归纳

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java IDEA学习之路:第十一、十二周课程笔记归纳

多线程
一、进程【理解】
1. 进程:操作系统(OS)中,每一个被执行的应用程序。
2. 注意:目前操作系统支持多进程,并发执行的任务。
3. 多进程并发执行的原理:微观上串行(一个一个的进程进行执行,获取cpu时间片的进程具有执行权);
宏观上并行(所有的进程看似一起执行)
二、线程
1. 概念:在一个进程中,并发执行的多个任务。线程是进程执行任务的单元、单位。
线程也被称为轻量级的进程。【理解】
2. 主线程:目前程序为单线程,此线程以main函数的开始为开始,以main函数的结束为结束,此线程被称为主
线程(主线程默认执行main函数)
3. 线程的组成部分:【理解】
(1) cpu:获取到cpu时间片的线程获取执行权
(2) 数据:栈空间独立(每一个线程有独立的栈空间);堆空间共享(多个线程可以操作同一个堆空间)。
栈空间用于存储局部变量;堆空间用于存储对象。
(3) 程序代码
4. 代码实现多线程【重点】
(1) 第一种方式:
a. 类继承 java.lang.Thread 类,覆盖 run方法
b. 创建线程对象:MyThread t1 = new MyThread();
c. 开启线程:t1.start() ; // JVM默认执行 run方法
(2) 第二种方式:
a. 类实现 java.lang.Runnable接口,同时实现run方法
b. 创建线程的目标对象:Mytarget mt = new MyTarget();
c. 创建线程对象: Thread t2 = new Thread(mt); // 将目标对象作为参数进行传递
d. 开启线程:t2.start(); // JVM默认调用run方法
三、线程状态

1. static void sleep(long ms):让当前线程处于休眠状态,休眠的单位是毫秒(ms),处于休眠状态的线程进入有限
期等待状态 。sleep方法会让当前线程释放cpu,但是不释放锁标记。
2. void join() : 让某 线程加入到自身任务中,在哪个线程中调用其他线程join方法,则代表此线程让步其他线程
优先执行,此线程从而进入无限期的等待状态。
例如:在主线程中main函数中: t.join() ; 代表主线程让步于t线程执行
四、线程同步【重点】
1. 临界资源:多线程并发时,被多个线程共享的同一个对象,称为临界资源。
2. 原子操作:不可以分割的多步操作,被视为一个整体,其执行顺序和步骤不能被打破。
3. 线程同步:多线程并发访问时,为了保证临界资源的正确性,从而不破坏操作中的原子操作。
(保护原子操作不能被破坏)
4. 线程同步的两种方式:
(1) 同步代码块:对临界资源对象进行加锁。
a. 定义位置:方法内部
b. 利用 synchronized 对临界资源加锁
c. 语法: synchronized(临界资源对象){
// 原子操作
}
d. 执行的原理:当线程获取临界资源的锁标记时,锁标记空闲,则能获取该对象的锁标记,获取锁标记之
后,可以执行同步代码块{}中的代码,而且只有当{}中所有的内容全部执行完,才释放拥有的锁标
记;但是当线程获取临界资源对象的锁标记时,锁标记被其他线程占用,则此线程进入阻塞状态
(Blocked状态),只有当其他线程释放锁标记,此线程获取锁标记,才结束阻塞状态,同时获取cpu,
可以执行{}中 的内容。

(2) 同步方法:
a. 用 synchronized修饰 方法:被 synchronized修饰的方法称为同步方法
b. 语法:
修饰符 synchronized 返回值类型 方法名(形参列表)throws 异常{
// 原子操作
}
c. 同步方法等价于 同步代码块:是对当前对象进行加锁
synchronized(this){
// 原子操作
}
五、线程间的通信
1. java.lang.Object类中提供了用于线程间通信的方法:等待wait与通知notify
2. 等待:wait() :
(1) wait方法的调用,需要使用在该对象的同步代码块中
(2) 如果一个线程调用了 wait方法,此线程进入等待状态,wait() -->进入无限期等待状态
(3) wait方法会当前线程释放锁标记,同时释放cpu
3. 通知:
(1) notify():通知一个线程从等待状态结束
(2) notifyAll(): 通知所有的线程从等待结束
注意:notify()/notifyAll的应用需要使用在该对象的同步代码块中;
notify()/notifyAll:只是起到通知的作用,不释放该线程拥有的锁标记。
面试题目:写出 sleep(long ms)方法 和 wait() 方法区别?
解 析:sleep(long ms):让线程进入休眠状态(有限期等待状态),同时释放cpu,但是不释放锁标记
wait()方法:让当前线程进入无限期等待状态,释放cpu同时也释放锁标记。
面试题目:写出 ArrayList 和 Vector的区别?
解析: ArrayList:线程不安全,方法为非同步方法,运行效率较高。
Vector:线程安全,方法为同步方法,不同线程需要等待锁标记,效率相对较低。
面试题目:HashMap 和 Hashtable的区别?
解析: Hashtable:线程安全,方法为同步方法,运行效率相对较低。
HashMap :线程不安全,方法为非同步方法,运行效率相对较高。
六、线程池 【开发应用】

1. 线程池:线程容器,预先创建一些线程存储在池中,线程池中线程可以被重复的使用。
2. 线程池的好处:减少创建线程和销毁线程的次数,反复使用池的线程,从而提高效率。
3. 常用的线程池对应接口和类:(位于 java.util.concurrent 包中)
(1) Executor : 线程池根接口、顶级接口。
(2) ExecutorService : 是 Executor的子接口,是线程池常用接口。
a. submit(Runnable r):将 Runnable类型的任务提交给线程池。
b. submit(Callable< V > c) :将Callable类型的任务提交给线程池。
c. shutdown():将线程池关闭,从而线程池自动销毁所有线程对象。
(3) Executors:线程池对应工具类(工厂类:提供线程池对象的类),内容提供大量静态方法,用于获取线
程池对象:
a. static ExecutorService newFixedThreadPool(int n) :创建一个可重复固定个数线程的线程池
对象,参数代表线程的数量。
b. static ExecutorService newCachedThreadPool():创建一个线程个数为动态的线程池对象,线
程池的线程个数没有上限。
七、Callable接口(位于java.util.concurrent包) 【开发应用】
1. JDK5.0之后提出一个Callable接口,应用类似于 Runnable接口,代表一个线程任务。
2. Callable接口带有泛型,常用的方法为:
V call():带有泛型类型的返回值,可以抛出任意类型异常。
3. 方法的调用:
(1) 同步调用:调用者一旦发生方法的调用,则调用者需要停下,被调用的方法方法先执行,被调用的方
法执行完毕之后,返回到调用位置,则调用者才能继续往下执行。
例如:商场购物
(2) 异步调用:调用者一旦发生方法的调用,调用者立即可以执行自身后续的内容。
例如:网上购物。
4. Future的应用:
(1) Future接口可以接收异步计算结果,例如:pool.submit(c); 对于 Callable任务的结果处理
(2) Future中常用的方法:
V get():从Future中获取结果。
八、常用的集合补充
1. 队列结构:先进的先出,后进后出。(FIFO)
2. Queue:是 Collection子接口,模拟队列结构,先进先出特点。(位于 java.util 包中)【练习】
常见的一些方法:

(1) add(Object o):往队列中添加一个元素。
(2) offer(Object o):往队列中添加一个元素。
(3) E poll() : 获取队头元素,并移除队头元素。
3. BlockingQueue: 是 Queue的子接口,位于java.util.concurrent包中。
(1) ArrayBlockingQueue:底层数组实现,需要指定容量
(2) LinkedBlockingQueue:底层链表实现,如果不指定容量,默认大小为2147483647的容量;
也可以指定容量。
4. LinkedList:是Queue的实现类
5. Collections 方法的补充:【扩充】
(1) static Collection synchronizedCollection(Collection c): 将不安全的Collection集合转换为安全性的
(2) static Set synchronizedSet(Set s):将不安全的Set集合转换为安全性的
(3) static Map synchronizedMap(Map map):将不安全的Map转换为安全性的
(4) static List synchronizedList(List list):将不安全的list转换为安全性的
6. Lock(锁) 的应用:【扩充】
(1) Lock:位于 java.util.concurrent.locks 包中,比之前的synchronized 使用更灵活和广泛。
(2) Lock 接口中方法:
a. void lock() : 获取锁
b. void unlock() :释放锁 。注意:通常将 unlock()方法调用放于 finally中
(3) ReentrantLock:是 Lock接口的实现类
7. ReadWriteLock (读写锁)的应用: java.util.concurrent.locks 包中 【扩充】
(1) ReadWriteLock :是一种支持一写多读的读写锁,可以分配读锁和写锁。
(2) ReentrantReadWriteLock:是 ReadWriteLock 的实现类
Lock readLock(): 获取读锁
Lock writeLock():获取写锁
(3) 读写之间的约束:
读-读 : 不互斥
读-写 :互斥
写-读 :互斥
写-写 :互斥
(4) 应用场景:读操作次数远远大于写操作次数时,效率提高。
总结:代码实现多线程的方式。【面试及应用重点】
(1) 类继承 Thread类,同时覆盖run方法-》线程执行体

创建线程对象,调用start方法开启线程
(2) 类实现Runnable接口,同时实现run方法--》线程执行体
创建目标对象,创建线程对象(将目标对象作为参数传递),利用start开启线程
(3) 类实现Callable接口(直接使用匿名内部类),同时实现call方法--》线程执行体
(Callable是带有泛型,泛型约束call方法的返回值类型)
借助线程池,完成Callable类型的任务
注意:以上三种方式都可以利用线程池完成线程任务。
8. 线程安全并且高效的一些集合类:
(1) CopyOnWriteArrayList:位于java.util.concurrent包中
a. 在写操作(改变集合元素内容的方法)中进行加锁,读操作不加任何锁,为了保证线程的安全性:
写写操作由于是加锁操作,相互互斥,但是写操作时,会在原有文本的基础上拷贝一个新的文本,
在新的文本上进行写操作,最终覆盖掉原有文本。
读与写操作不互斥,读的时候直接读取原始数据,写操作会在原始文本上完成复制之后再进行写操作。
b. 牺牲写操作的效率,从而提高读操作的效率
c. 应用场景:读操作次数远远大于写操作次数时,效率相对较高。
面试题目:CopyOnWriteArrayList 和 ArrayList的区别。
解析: CopyOnWriteArrayList线程安全,在写操作上进行加锁,同时写操作时拷贝一个新的文本,
在读操作次数远远大于写操作次数,效率仅次于ArrayList
ArrayList:运行效率高,但是线程不安全。
(2) ConcurrentLinkedQueue : 位于java.util.concurrent包中,线程安全并且高效的Queue接口的实现类,她
是采用的比较交换算法(CAS算法)实现的线程安全。
(3) ConcurrentHashMap : 位于 java.util.concurrent 包中
a. 减小锁粒度(范围),从而较少锁冲突的可能性,进而提高效率。
b. ConcurrentHashMap将底层分为16个小的HashMap结构,每一个称为段,共16段。
c. 注意:全局操作(size() )的次数不频繁时,效率相对较高。
面试题目:ConcurrentHashMap 和 HashMap 的区别。
解析:ConcurrentHashMap线程安全,并且在全局操作不频繁时,效率较高。
是通过减小锁粒度从而提高效率;
ConcurrentHashMap不允许null作为键和值
HashMap:线程不安全,但是运行效率较高。允许null作为键和值。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 11:27:12

卡在学历的开发者困境,一个 Vue 开发者的60天求职之路【一】

今天是失业的第60天。过去一个月&#xff0c;我投出90多份简历&#xff0c;主动联系450位招聘方&#xff0c;收到了10次面试机会&#xff0c;全部认真完成面试。 理想很丰满&#xff0c;现实很骨感&#xff0c;结果却如出一辙&#xff1a;有的止步于背调环节——技术面顺利通过…

作者头像 李华
网站建设 2026/5/12 3:19:38

QNetworkReply-QNetworkAccessManager-put-内存申请注意事项

展示 reply manager->put(request, ftpsendfile);简介 在Qt C中执行manager->put(request, ftpsendfile)时&#xff0c;内存管理涉及多个层面&#xff0c;需结合Qt对象模型、网络模块特性及C内存管理规则分析。以下从内存申请点和回收策略两方面详细说明&#xff1a; 内…

作者头像 李华
网站建设 2026/5/12 2:31:18

威斯康星大学麦迪逊分校课程数据集成数据集:193个学科领域超9千门课程的全面教学信息资源

威斯康星大学麦迪逊分校课程数据集成数据集&#xff1a;193个学科领域超9千门课程的全面教学信息资源 引言与背景 威斯康星大学麦迪逊分校课程数据集成数据集是一个综合性、权威性的高等教育教学资源库&#xff0c;完整记录了该校丰富的课程体系、精细的教学安排以及全面的学术…

作者头像 李华
网站建设 2026/5/9 22:18:37

计算机毕业设计springboot基于协同过滤算法的新闻推荐系统 基于Spring Boot框架与协同过滤算法的新闻个性化推荐系统设计 Spring Boot驱动的新闻推荐系统

计算机毕业设计springboot基于协同过滤算法的新闻推荐系统9k0339&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着互联网的飞速发展&#xff0c;新闻信息的海量增长给用户带来…

作者头像 李华
网站建设 2026/5/11 16:17:17

文献系统综述在期末学习中的应用研究与实践探讨

你是不是也这样&#xff1a;下载的PDF堆满文件夹&#xff0c;想找的时候死活记不住名字&#xff1b;读文献时灵感一闪&#xff0c;回头却找不到记在哪了&#xff1b;写论文时&#xff0c;调整一个引用格式就要折腾半小时…文献管理不是小事&#xff0c;它直接决定了你的研究效率…

作者头像 李华
网站建设 2026/5/12 8:06:49

2025年最值得关注的8款开源 AI 平台

前言 2025年AI应用开发需求持续增长&#xff0c;开源AI平台凭借低成本、高灵活度的特性&#xff0c;成为开发者解决工具碎片化、落地效率低等问题的重要选择。本文围绕功能完整性、易用性、扩展性、社区活跃度、商业可用性五大维度&#xff0c;结合本地部署实测&#xff08;测…

作者头像 李华