多线程
进程: 一个正在运行的程序
线程: 进程里的一条命令或者一个任务
在java中创建多线程的方法:
1,继承Thread类,重写run方法
优点: 可以直接通过start方法启动线程,
2,实现Runnable接口实现run方法
优点: 可以取消占用extends关键字, interface可以多实现, 可以实现资源共享, 但需要创建Thread类并将其传入调用start方法才能运行
当多个线程同时访问一个资源时,常常会引起并发问题,因此需要使用线程同步来解决安全问题
线程同步synchronized
线程同步的前提:
1,必须有两个或者两个以上的线程
2,多线程使用统一资源
3,必须保证同步中只能有一个线程在运行
使用synchronized同步线程时,既可以同步对象,亦可以同步方法
线程的五个状态:
新生,就绪,运行,阻塞,死亡
可以使进程进入阻塞状态的方法:
Sleep()睡眠,时间到后会自动唤醒
Wait()等待,需要notify方法唤醒
Join():加入,可以使其他进程进入阻塞状态
线程通信:
Object类中拥有的方法: wait()/notify()/notifyAll()用于解决线程间的通信问题
Wait():使当前线程等待,进入阻塞状态
Notify():唤醒其他等待的线程,不能唤醒自己
NotifyAll:唤醒所有等待的线程,包括自己
网络编程:
UDP与TCP:
UDP: 不需要建立连接,发送大小限制在64KB以内,不安全但效率高,易丢包
TCP: 需要建立连接(进行三次握手),效率低但安全
InetAddress类:
InetAddress表示互联网协议地址(IP),包含各种获取主机名和IP地址的方法
端口:
端口是每一个程序的出入口,是虚拟的概念,通过端口,可以在一个主机上运行多个应用程序
TCP的简单建立流程:
Client:
新建Socket对象
获取输出流进行发送
卸载流
获取输入流接收服务器返回的数据
卸载流
Sever:
新建SeverSocket对象
通过SeverSocket对象的accept方法获取Socket对象
获取输入流接收客户端信息
卸载流
获取输出流发送信息给客户端
卸载流
UDP通信:
使用DatagramSocket和DatagramPacket进行通信
新建DatagramSocket对象
新建DatagramPacket包,将字节数组传入包中
使用DatagramSocket的send方法发送
再次新建DatagramPacket包
使用DatagramSocket的receive方法接收发来的包