复习
- 进程是计算机中在执行的任务,线程是进程中的任务
- Java中定义线程的方式有3种:继承Thread类,实现Runnable接口,实现Callable接口
- 多线程的并发安全问题:多个线程之间并不是轮询执行,而是相互抢占,并且抢占会发生在线程执行过程中的每一步,从而导致产生数据安全问题
- 利用synchronized代码块来解决并发问题,在使用synchronized的时候,需要指定锁对象:共享资源、类的字节码对象、this
- 死锁:由于线程之间的锁相互嵌套,导致程序既不继续执行也不报错
- 线程的等待唤醒机制:通过wait和notify来使线程进入等待状态或者被唤醒,来调节线程之间的执行顺序
API
一、线程
- 线程的状态
- 实际生产过程中,线程创建的方式:
- 主动创建,例如打开某个软件
- 系统自启动
- 关联唤醒,例如APP的跳转
- 线程的结束方式
- "寿终正寝"
- 意外"死亡" - 程序运行过程中出现错误
- "他杀" - 强制结束
- 线程的阻塞可能
- 没有抢到执行权或者被别人抢走执行权
- 线程被休眠 - sleep
- 线程被等待/冻结 - wait
- sleep和wait的区别
- sleep是Thread的静态方法,在休眠的时候需要指定休眠时间,时间到了之后被休眠的线程会自动"醒"过来然后进行执行权的抢夺。如果没有锁,线程sleep期间会释放执行权;如果有锁,那么在锁内sleep的时候,执行权不会被抢走的
- wait是Object的成员方法。wait的时候一般需要进行唤醒的,wait必须结合锁来使用。如果线程被wait,那么这个线程占有的锁和执行权都会被释放
- 线程的优先级:线程的优先级有1-10一共十个等级,数字越大,等级越高。理论上,线程的优先级越高,线程能够抢占到执行权的概率越大,但是实际过程中,相邻的两个优先级的差别并不明显。实际过程中,一般优先级相差到5以上,才会相对明显。如果不指定,线程的优先级默认为5
- 守护线程
- 用于监控/守护其他线程,当被守护线程结束之后,守护线程无论是否执行完成都会随之结束
- 线程要么是守护线程,要么是被守护的线程
- 如果存在多个被守护线程,那么会在最后一个被守护线程结束的时候来结束掉所有的守护线程
二、网络编程
- 网络编程实际上基于网络进行数据传输的流
- 按照ISO国际体系划分,网络实际上分为七层:物理层、数据链路层、网络层、传输层(UDP、TCP)、应用层、会话层、表示层
- IP地址:通过一组数字来标记网络中的计算机的地址。根据不同协议,现在有不同版本的IP地址,比较常用的IP协议有2大类:IPv4,IPv6
- 端口:计算机和网络进行数据交互的媒介。端口号是从0开始一直到65535,其中计算机被系统占用的端口大部分集中在0~1024之间
- 域名:用一串有意义的字符串来表示某个地址
- 一级域名表示的是行业或者国别,例如cn,cc,com,org,gov,edu等
- 二级域名表示的是公司或者商标,例如baidu,jd,taobao,tmall,tencent等
- 三级域名表示的是 应用,例如baike,news,music,mail等
- DNS解析服务器:进行IP地址和域名的映射。每一个局域网内都会自动产生一个DNS服务器
- InetSocketAddress:用于表示IP和端口的类
- UDP:基于网络进行数据传输的流,传输速度相对较快,但是在进行数据传输的时候不可靠,适合于要求速度但是不要求可靠性的场景,例如微信视频电话、直播等
- UDP发送端
- 定义套接字对象
- 定义数据包,将数据和地址放入数据包
- 发送数据包
- 关流
- UDP接收端
- 定义套接字对象,绑定要监听的IP
- 准备数据包
- 接受数据
- 关流
- 解析数据
- 案例:聊天
- 特殊地址:255.255.255.255表示广播地址



