复习:
1、 线程
a) 是进程中在执行的任务或者是逻辑
b) 每一个核在同一时刻内只能执行一个进程中的一个线程
c) 引入多线程的意义:提高CPU的利用率
d) 定义线程的方法:继承Thread,实现Runnable,实现Callable
e) 多线程的并发安全问题:多个线程同时执行,多个线程之间是相互前瞻资源导致出现了不合理的数据
f) 同步机制:synchronized – 同步代码块,同步方法
i. 同步代码块在使用的时候需要指定锁对象,锁对象要求被所有的线程都认识:共享资源、方法区中的数据、this
ii. 同步方法的锁对象:如果是非静态方法,那么锁对象是this;如果是静态方法,锁对象是当前类
iii. 死锁:多个线程之间的锁产生了嵌套
g) 等待唤醒机制:wait,notify ,notifyAll
h) 线程的状态:初始、就绪、运行、阻塞、消亡
i) 线程出现或者销毁的方法
j) 守护线程:被守护的线程结束,守护线程就随之结束。一个线程要么是守护线程要么是被守护线程。
k) 线程的优先级:1-10。理论上数字越大,优先级就越高,那么抢占到资源的概率就越大,但实际上,
24中常见的模式
单例模式
在全局过程中只存在唯一的一个实例。
定义的时候就进行初始化的方式 - - - 饿汉式
把实际初始化的过程给推后的方式 - - - 懒汉式
由于懒汉式把初始化过程给推后,所以能相对提高类的加载效率,但是存在线程安全问题
饿汉式在类加载的时候就把对象进行了初始化,所以不存在线程安全问题。如果没有用到这个对象,但是这个对象依然要初始化,会增长加载时间。
扩展:了解单例模式的七种方法
网络编程(套接字)
是利用网络进行数据传输的机制- - - 本质上就是一套基于网络的流
网络基本概念:
ISO七层模式
物理层、数据链路层、网络层、传输层(UDP/TCP)、会话层、表示层、应用层- -http、ftp、POP3、 SMATP
IP地址:在网络中对主机进行地址标记IPv4:用四个数据来表示一个IP地址,每一个数字的取值范围是0~255 10.5.20.86;IPv6。
端口:主机和外界进行信息交互的媒介。端口号:065536。其中有一部分端口是被系统默认占用的,大部分分布在了(01024)。
域名:为了方便记忆而产生的名称- - - baidu.com, news.baidu.com - - - 一级域名往往是用于标记网站类型,二级域名往往是公司名称,三级域名往往是应用类型
DNS解析服务器:将域名和IP地址进行对应
UDP:
基于流的。不建立连接,不可靠,传输速度相对较快。在传输数据的时候要对数据进行封包,每一个包不超过64K大小。适用于对速度依赖性比较高对可靠性要求比较低的场景 - -视频聊天、直播
发送端:
- 创建套接字对象
- 准备数据包,将数据以及发送地址写到数据包中
- 发送数据
- 关流
接收端
- 创建套接字对象,绑定要监听的端口号
- 准备数据包用于存储数据
- 接收数据
- 关流
- 解析数据
练习:一个线程表示发送端,一个线程表示接收端,实现单人聊天
255.255.255.255广播地址
TCP:
基于流的。建立连接,经过三次握手,可靠。传输速度相对较慢。理论上不限制数据的大小。适用于对可靠性要求较高而对速度要求较低的场景 - - - 文件传输
客户端:
- 创建一个客户端套接字对象-Socket
- 发起连接,绑定连接地址
- 获取自带的输出流
- 写出数据
- 通知服务器端数据已经写完
- 关流
服务器端:
- 创建一个服务器套接字对象 – ServerSocket,绑定要监听的端口号
- 接受连接,获取到一个Socket对象
- 从连接中获取到输入流
- 利用输入流来读取数据
- 通知客户端数据已经读完
- 关流
注意:receiver/connect/accept/read/write 产生阻塞
扩展:
BIO – Blocking IO – 同步式阻塞式IO - 最早的流
NIO – New IO – NonBlocking IO – 同步式非阻塞式IO – JDK1.4
AIO – Asynchronous IO – 异步式非阻塞式IO – JDK1.8
练习:将文件从客户端上传到服务器端
文件名:
用两个字节来表示文件名:
扩展:利用TCP实现单人聊天
断言
根据已知条件来预测和确定结果
在Java中,断言不是默认开启,需要在运行的时候添加参数 -ea
给所有工程设置断言:
断点调试-Debug模式
F5 – 钻入方法
F6 – 执行到下一行
F7 – 回退一步
F8 – 执行到下一个断点