前言:作者是一名正在学习JAVA的初学者,每天分享自己的学习笔记,希望能和大家一起进步成长
目录
线程(重点)
第一种线程的实现
第二种线程的实现
线程的执行原理
线程的生命周期
休眠
线程的并发
Synchronized修饰在方法体
Synchronized修饰在方法
死锁
网络编程
网络模型
OSI(模型):七层协议
TCP五层模型
HTTP(超文本传输协议)
HTTP请求
HTTP响应格式
常用的命令(重点)
本机地址(重点)
端口
TCP和UDP(重点)
Socket
TCP通信
服务端
客户端
进程: 进程是指在系统中正在运行的一个应用程序
线程: 线程是进程的一个单元。
多线程: 一个进程中有多个线程在同时运行。
Jvm是多线程的,在我们运行jvm的时候,后台会运行垃圾回收的线程,来清理没有被引用的对象
类声明为Thread的子类,该子类应该重写Thread类的run方法,
线程启动的时候使用线程start方法而不是run,调用run方法相当于是调用普通的方法
类直接实现Runable接口
实现run的方法
线程的并发执行是通过多个线程不断的切换CPU的资源,这个速度非常快,我们感知不到,我们能感知到的就是几个线程并发在执行
1. 新建: 线程被new出来
2. 准备就绪: 线程具有执行的资格,即线程调用了start(),没有执行的权利,就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行
3. 运行: 具备执行的资格和执行的权利,当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能
4. 阻塞: 没有执行的资格和执行的权利,在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如Thread.sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;
5. 销毁: 线程释放资源, 如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;
Thread.sleep(1000) 1000毫秒, sleep只是当前线程休眠,然后让出CPU,当然不会释放锁。
wait的用法:(wait会释放锁) 1.必须配合synchronized使用 2.且使用的必须为同一个对象:synchronized (A)配合A.wait()使用 3.当线程执行到object.wait()时,此线程会同时释放锁synchronized (object);当它结束了wait后,此线程又会重新去争抢锁synchronized (object)。
wait结束等待: 1.使用notify: 必须配合synchronized使用 使用notify的对象为A,则只能唤醒A.wait()的线程,不能唤醒B.wait()的线程; 小区别: notify()方法——随机唤醒一个wait的线程 notifyAll()方法——唤醒所有wait的线程,让这些被唤醒的线程去争抢,按争抢顺序依次执行
案例: 比如说12306卖火车票,小米抢购
例如: 动车站有100张票,3个窗口同时卖票。
分析: 有3个窗口就是3个线程同时在运行,100个票同时供给3个窗口
是指多个线程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进
作业: 写一个死锁和卖票的程序
什么是网络编程:
就是用来实现网络互通的不同计算机运行程序之间进行数据的交换的编程
应用层: 如: HTTP协议 主要解决如何包装数据,用于通信的应用程序和用于消息传输的底层网络提供接口,提供常见的网络应用服务 |
---|
表示层: Linux给window发包,两个系统语法不一致,就像安装包一样,exe是不能在linux下用的,shell在window下也是不能直接运行的。于是需要表示层,帮我们解决不同系统之间的通信语法问题 |
会话层: 要建立一个自动收发包,自动寻址的功能。会话层的作用就是建立和管理应用程序之间的通信,自动调用TCP去打包 |
传输层: 如: TCP协议 保证传输大量文件时的准确性。于是,对发出去的数据进行封装。就像发快递一样,一个个地发。 |
网络层: 如: IP协议 即路由器,交换机那些具有寻址功能的设备所实现的功能。这一层定义的是IP地址,通过IP地址寻址。所以产生了IP协议 |
数据链路层:通过无线电波,通过其它介质来传输。然后我还要保证传输过去的比特流是正确的,要有纠错功能。 |
物理层: 主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等它的主要作用是传输比特流, |
TCP/IP协议中的应用层处理七层模型中的第五层、第六层和第七层的功能。TCP/IP协议中的传输层并不能总是保证在传输层可靠地传输数据包,而七层模型可以做到。TCP/IP协议还提供一项名为UDP(用户数据报协议)的选择。UDP不能保证可靠的数据包传输
是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式
由三部分组成,分别是:请求行、消息报头、请求正文。
请求行
Method Request-URI HTTP-Version(三部分空格隔开)
其中:
Method表示请求方法 GET 请求获取Request-URI所标识的资源 POST 在Request-URI所标识的资源后附加新的数据(GET请求往往把自制 数据放在quary_string中,POST请求往往把自定制数据放在body中) HEAD 请求获取由Request-URI所标识的资源的响应消息报头 PUT 请求服务器存储一个资源,并用Request-URI作为其标识 DELETE 请求服务器删除Request-URI所标识的资源 TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断 CONNECT 保留将来使用 OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求 Request-URI是一个统一资源标识符; 请求的地址 HTTP-Version表示请求的HTTP协议版本。 现在大多都是1.1的
消息报头(header)
若干个键值对,每个键值对占一行,每个键和值之间使用:分割
请求正文(body)
一般GET请求没有body,POST请求才有
HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文。
状态行
HTTP-Version表示服务器HTTP协议的版本;
Status-Code表示服务器发回的响应状态代码;
Reason-Phrase表示状态代码的文本描述。
状态码: 1xx:指示信息–表示请求已接收,继续处理; 2xx:成功–表示请求已被成功接收、理解、接受; 3xx:重定向–要完成请求必须进行更进一步的操作; 4xx:客户端错误–请求有语法错误或请求无法实现; 5xx:服务器端错误–服务器未能实现合法的请求。
消息报头(header)
任然是一组键值对,每个键值对占一行每个键和值之间用:分割
Content-Type:描述了body的数据格式类型; Content-Length:描述了body的数据长度(字节Byte); Host:描述了访问的主机名(域名/ip); Referer:当前页面是从哪个页面跳转过来的; Cookie:字符串,浏览器的本地存储的能力之一,中经常会包含一种叫做“身份标识”的信息(session id); Session:服务器端维护的一个数据结构,记录了用户的身份信息,session id就是session对象的唯一身份标识,session id 存在浏览器中,浏览器后续在访问服务器的时候,就会自动带着session id,从而让服务器知道当前请求是哪个用户发来的。
User-Agent:会告诉网站服务器,访问者是通过什么工具来请求的,手机还是电脑等。
响应正文(body)
响应中的正文格式也有很多种,比如可以是一个html,也可以是一个css,也可以是一个JavaScript,还可以是一个图片数据,还可以是一个json数据
ping ,ipconfig ,telnet
127.0.0.1 代表自己的电脑主机
localhost 代表本机
用于标识进程的逻辑地址,不同的进程端口不同。
netstat -ano
比如说QQ,微信,是通过ip:端口发送数据到对应好友的电脑上。
常见的两种协议:
UDP:将数据源和目的地封装到数据包中,不需要建立连接
每个数据包的大小有限制
因为不用建立连接,所以安全性差,但是速度快
TCP: 建立连接形成传输数据的通道,然后再传输数据,通过三次握手。安全性高,效率低
Socket是网络编程提供的一种机制,通信的两端都要有socket,网络通信其实就是socket间的通信,数据在socket间的io流上通信