目录
java网络编程
客户端 -> 服务器
-TCP
-UDP
URL:
统一资源定位符号
Class URL表示统一资源定位符,指向万维网上的“资源”的指针。
资源可以像文件或目录一样简单,或者可以是对更复杂的对象的引用,例如对数据库或搜索引擎的查询。
组成:
【协议+主机地址+端口号+资源路径+查询参数+锚点】
方法:
String getFile()
获取此 URL的文件名。
String getHost()
获取此 URL的主机名(如适用)。
String getPath()
获取此 URL的路径部分。
int getPort()
获取此 URL的端口号。
String getProtocol()
获取此 URL的协议名称。
String getQuery()
获取此 URL的查询部分。
String getRef()
获取此的锚定(也称为“参考”) URL 。
InetAddress
Internet协议(IP)地址
方法:
byte[] getAddress()
返回此 InetAddress对象的原始IP地址。
static InetAddress[] getAllByName(String host)
给定主机的名称,根据系统上配置的名称服务返回其IP地址数组。
static InetAddress getByAddress(byte[] addr)
给出原始IP地址的 InetAddress对象。
static InetAddress getByAddress(String host, byte[] addr)
根据提供的主机名和IP地址创建InetAddress。
static InetAddress getByName(String host)
确定主机名称的IP地址。
String getCanonicalHostName()
获取此IP地址的完全限定域名。
String getHostAddress()
返回文本显示中的IP地址字符串。
String getHostName()
获取此IP地址的主机名。
static InetAddress getLocalHost()
返回本地主机的地址。
TCP编程
TCP: 传输控制协议
特点: 面向连接,有序的,可靠的,以字节流的方式传输数据。
作用类:
服务器: ServerScoket
客户端: Socket
UDP编程
UDP: 用户数据报协议
特点: 面向无连接,不可靠的,无序的,以数据包(DatagramPacket)的方式发生数据。
传输效率高。
DatagramSocket:通信类
DatagramPacket:数据报包类。
线程和进程
每个独立执行的程序称为进程。
线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源,多个线程共享内存,从而极大地提高了程序的运行效率。
进程与线程的关系
进程的产生,肯定会产生至少一个以上的线程;
进程关闭,该进程内的线程会全部销毁;
线程销毁,进程未必会关闭
多线程,指的是一个进程内的多个任务并发执行。
多线程的好处:可以更高效地利用CPU资源,同时,让固定流程的程序更加灵活;
注意:多个线程之间,谁先抢占到资源,谁就先执行。
多线程实现
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口
4.线程池
Runnable和Callable的区别:
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以,因为run方法本身没有抛出异常,所以自定义的线程类在重写run的时候也无法抛出异常
(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
多线程生命周期
创建-->就绪-->执行-->阻塞-->死亡
线程常用方法
static Thread currentThread() :返回对当前正在执行的线程对象的引用。
String getName() :返回此线程的名称。
void setName(String name) :将此线程的名称更改为等于参数 name 。
long getId() :返回此线程的标识符。
int getPriority() :返回此线程的优先级。
void join() :等待这个线程死亡。
static void sleep(long millis):使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。
static void yield() 对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。 (线程礼让)
死锁
概念:当进程正在争抢资源时,每个进程都在等待另一个进程释放它所需的资源,导致所有进程
无法前进。
死锁产生的条件:
-
互斥条件(Mutual Exclusion): 一个资源每次只能被一个进程或线程使用。如果一个进程已经获得了某个资源,其他进程必须等待。
-
占有并等待条件(Hold and Wait): 进程至少占有一个资源并且在等待获取其他进程占有的资源。
-
非抢占条件(No Preemption): 已经分配给一个进程的资源不能被抢占,只能在进程使用完之后自行释放。
-
循环等待条件(Circular Wait): 存在一个进程的资源等待链,其中最后一个进程在等待第一个进程释放资源。
如下代码,线程1获得锁然后进行了休眠,在休眠过程中并没有释放资源,而线程2又在请求资源
在这个过程中就发生了互斥死锁
public class Deadlock {
private static Object lock1 = new Object();
private static Object lock2 = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
synchronized (lock1) {
System.out.println("Thread 1: 获得了锁 1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("Thread 1: 获得了锁 2");
}
}
});
Thread t2 = new Thread(() -> {
synchronized (lock2) {
System.out.println("Thread 2: 获得了锁 2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1) {
System.out.println("Thread 2: 获得了锁 1");
}
}
});
t1.start();
t2.start();
}
}