作者:熊熊oO7sloveV | 来源:互联网 | 2024-11-02 14:38
2021年7月22日上午9点至中午12点,我专注于Java的学习,重点补充了之前在视频中遗漏的多线程知识。首先,我了解了进程的概念,即程序在内存中运行时形成的一个独立执行单元。其次,学习了线程作为进程的组成部分,是进程中可并发执行的最小单位,负责处理具体的任务。此外,我还深入研究了Runnable接口的使用方法及其在多线程编程中的重要作用。
上午9点~中午12点
学习Java,补充看视频多线程漏掉的知识
1,进程:就是一个程序进行内存运行时, 变成一个进程
2,线程:进程的组成部分,就是进程时分成的许多小任务
3,Runable和Callable,前者具有的功能,后者都有,后者的方法,call()方法可以有返回值,且可以声明-抛出异常,
4,线程死亡的标志,run()或者call()执行完成
5,wait()与sleep()的区别:
- sleep()方法是Thread类中方法,而wait()方法是Object类中的方法。
- sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态,在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备。
6,join()方法Thread类提供,让一个线程等待另一个线程的完成的方法,当在某个程序执行流中调用其他线程的方法时,调用线程将会被阻塞
7,线程安全:线程安全就是多线程访问同一代码,不会产生不确定的结果
8,使线程安全:
- 对非安全的代码进行加锁控制
- 使用线程安全的类
- 多线程并发情况下,线程共享的变量改为方法级的局部变量
9,死锁:死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。就是它们都在等对方释放同步监视器
10,解决死锁的方法:
- 避免多次锁定,尽量避免同一个线程对多个同步监视器进行锁定
- 具有相同的加锁顺序
- 使用定时锁
- 死锁检测
11,线程池:有效的控制系统中并发线程的数量,线程run()或call()结束后,该线程并不会死亡,而是返回线程池中成为空闲状态
下午答辩
思考补充漏掉的知识点
1,JDK:
JDK主要包含三部分:
- 第一部分就是Java运行时环境,JVM
- 第二部分就是Java的基础类库,这个类库的数量还是非常可观的
- 第三部分就是Java的开发工具,它们都是辅助你更好的使用Java的利器
2,JRE:运行环境
3,关系:
4,Collection与Collections的区别:
- Collection:是集合类的上层接口。本身是一个Interface,里面包含了一些集合的基本操作Collection接口时Set接口和List接口的父接口
- Collections: Collections是一个集合框架的帮助类,里面包含一些对集合的排序,搜索以及序列化的操作
5,将数组转化为List:
- Arrays.asList(strArray) 方式:将数组转换List后,不能对List增删,只能查改,否 则抛异常。此时是java.util.Arrays.ArrayList 这里面有java.util.Arrays里面的内部类,里面没有重写增删方法,就会调用父类的AbstractList,可以看到父类的增删方法,就会报错,即使调用iterator也会报错
- ArrayList的构造器
将Arrays.asList(strArray)的返回值由java.util.Arrays.ArrayList 转为java.util.ArrayList - 集合工具类Collections.addAll()方法
通过Collections.addAll(arrayList, strArray)方式转换,根据数组的长度创建一个长度相同的List,然后通过Collections.addAll()方法,将数组中的元素转为二进制,然后添加到List中,这是最高效的方法。