导图社区 网络开发多线程编程设计方法总结
这是一篇关于网络开发多线程编程设计方法总结的思维导图,对网络开发多线程编程设计方法总结感兴趣的小伙伴可以点赞加收藏
编辑于2022-11-18 09:36:45 广东网络开发多线程编程设计方法总结
多线程
创建线程的两种方式
方式1: 继承Thread类
a: 自定义类继承Thread类 b: 重写run()方法 c: 创建自定义类对象 d: 调用start()方法2
方式2: 实现Runnable接口
a: 自定义类实现Runnable接口 b: 重写run()方法 c: 创建自定义类对象 d: 创建Thread对象,并把自定义类对象作为构造参数 e: 调用start()方法
方法
getName() : 返回线程的名字 默认的线程名字 Thread-编号 编号从0开始 setName() : 设置线程的名字 currentThread(); 获取当前运行的线程对象
线程优先级
public final int getPriority()返回线程的优先级。 public final void setPriority(int newPriority)更改线程的优先级。
暂停线程
public static void yield()暂停当前正在执行的线程对象,并执行其他线程。
等待终止线程
public final void join(long millis) 等待该线程终止的时间最长为 millis 毫秒 注意: 必须要在线程启动后(start) 才能使用
守护线程
public final void setDaemon(boolean on)将该线程标记为守护线程或用户线程。 当正在运行的线程都是守护线程时,Java 虚拟机退出。
构造函数
Thread(Runnable r)
使用给定的Runnable实现对象,创建一个线程对象
Thread(Runnable r, String name)
使用给定的Runnable实现对象,创建一个线程对象, 并且指定线程名字
Lock: 锁
JDK5 出来一种新 锁方式 lock(): 上锁 unLock(); 解锁
死锁:多个线程之间,相互访问
(案例, 抢筷子)
等待唤醒机制的原理:
使用wait()、notity()来完成操作
存数据: 如果原有的内容没有取走,不存入新数据,等待取走后,存入新数据
取数据: 如果原有的内容已经取走,等待新数据,当新数据存入后,再取出
面试题(sleep、wait)
wait
让线程暂停 可以指定时间,也可以不指定,可以通过notity、 notityAll 释放锁的所有权
sleep
让线性休眠 必须指定时间,时间到了后,线程会自动醒来 在休眠的时候,不会释放锁的所有权,当休眠时间到后,会继续执行
网络编程
网络编程概述:
就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换
网络模型
OSI(Open System Interconnection开放系统互连)参考模型
应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
TCP/IP参考模型
网络通信三要素
IP地址
A类 1.0.0.1---127.255.255.254 B类 128.0.0.1---191.255.255.254 C类 192.0.0.1---223.255.255.254 D类 224.0.0.1---239.255.255.254 E类 240.0.0.1---247.255.255.254
IP地址 = 网络号码+主机地址
A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码 255*255*255
B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码 255*255
C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码 255
特殊地址
xxx.xxx.xxx.255 广播地址
端口号
A:每个网络程序都会至少有一个逻辑端口 B:用于标识进程的逻辑地址,不同进程的标识 C:有效端口:0~65535,其中0~1024系统使用或保留端口
协议UDP和TCP
UDP
将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快
TCP
建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低
Socket
Socket就是为网络编程提供的一种机制; 通信的两端都有Socket; 网络通信其实就是Socket间的通信; 数据在两个Socket间通过IO传输。
UDP传输
DatagramSocket与DatagramPacket 建立发送端,接收端。 建立数据包 调用Socket的发送接收方法。 关闭Socket。 发送端与接收端是两个独立的运行程序
TCP传输
Socket和ServerSocket 建立客户端和服务器端 建立连接后,通过Socket中的IO流进行数据的传输 关闭socket 同样,客户端与服务器端是两个独立的应用程序。
反射
反射
通过class文件的对象,获取构造函数、字段、方法的操作
学习反射的目的
有些时候,可能JDK中的方法没有在帮助文档中提供,但是通过查看源代码,却发现有这个方法,不会该方法为private私有,所以JDK的帮助文档没有提供该方法。 如果,必须要用这个方法, 我们可以通过反射的方式来获取,进行使用
如何获取Person类的 字节码文件对象呢?
方式1: getClass(): 返回进行时的类
方式2: 数据类型.class 静态属性,来获取当前数据类型的字节码文件对象
方式3: public static Class forName(String className) 返回与带有给定字符串名的类或接口相关联的 Class 对象
构造函数: Constructor
public Constructor[] getConstructors() : 获取所有的公共的构造函数 public Constructor[] getDeclaredConstructors(): 获取所有的构造函数(包含私有)
public Constructor getConstructor(Class<?>... parameterTypes) 获取指定的构造函数 public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取指定的构造函数 (包含私有的)
public void setAccessible(boolean flag) : 是否可以访问(暴力访问)
public Object newInstance(Object... initargs) 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例
步骤
a:创建一个Class字节码文件对象 b:获取指定的构造函数 如果是非public的构造函数,需要 强制访问(暴力访问) c:创建对象
字段: Field
Class中的方法
public Field[] getFields() : 获取 public 修饰的 所有字段 public Field[] getDeclaredFields(): 获取所有的字段(包含私有)
public Field getField(String name): 获取指定的字段 public Field getDeclaredField(String name): 获取指定的字段(包含私有)
Field中的方法
public void set(Object obj, Object value): 为指定对象中的当前字段, 赋值
步骤
a: 创建class字节码文件对象 b: 获取指定的字段,如果是非public 修饰的字段, 需要 暴力访问 c: 对字段进行操作
方法: Method
Class类中的方法
public Method[] getMethods() 获取所有的公共方法(包含父类的) public Method[] getDeclaredMethods() 获取所有的方法(不包含父类)
public Method getMethod(String name, Class<?>... parameterTypes) : 获取指定的方法 public Method getDeclaredMethod(String name, Class<?>... parameterTypes) : 获取指定的方法(包含私有的)
Method类的方法
public Object invoke(Object obj, Object... args)
调用给定的对象中的当前方法,并且给定方法的参数列表,这个时候就可以确定调用的是具体的哪一个方法了
步骤:
a: 创建class 字节码文件对象 b: 获取指定的方法 c: 使用方法(需要前有对象,才能使用方法)
设计模式
单例设计模式
原理:保证在内存中 只有一个对象存在
如何去保证:
构造函数私有化 自己创建当前类对象 对外提供公共的方法(获取已经创建好的对象的)
饿汉式
class Teacher { private Teacher(){} private static Teacher t = new Teacher(); public static Teacher getTeacher(){ return t; } }
懒汉式
class Teacher { private Teacher(){} private static Teacher t = null; public synchronized static Teacher getTeacher(){ if(t == null){ t = new Teacher(); } return t; } }
两种设计模式的区别
饿汉式: 随着类的加载而创建对象
懒汉式:上来不创建对象,当调用的时候,再创建对象,以后使用的就是同一个对象了
懒汉式: 懒加载、延迟加载
模板设计模式
我们有一个Word文件, 页眉,正文,页脚 abstract class Word文件{ 页眉(); 正文(); 页脚(); public abstract void 页眉(); public abstract void 正文(); public abstract void 页脚(); }