当前位置: 首页 > 后端技术 > Java

Java笔记(8)

时间:2023-04-01 14:29:01 Java

多线程与网络编程一、多线程1、进程与线程进程:是一个运行的程序,是系统进行资源分配和调用的独立单元。每个进程都有自己的内存空间和系统资源线程:是进程中单一的顺序控制流,是一条执行路径。单线程:如果一个进程只有一条执行路径,则称为单线程程序。多线程:如果一个进程有多个执行路径,则称为多线程程序。2、多线程的实现方式方法一:继承Thread类:定义一个MyThread类继承Thread类,重写MyThread类中的run()方法,创建MyThread类的对象,启动线程。两个小问题:为什么要重写run()方法?因为run()是用来封装线程执行的代码的。run()方法和start()方法的区别?run():封装线程执行的代码,直接调用,相当于调用start():启动线程;然后JVM调用这个线程的run()方法。方法二:实现Runnable接口定义一个类MyRunnable来实现Runnable接口重写MyRunnable类中的run()方法创建MyRunnable类的对象创建Thread类的对象,将MyRunnable对象作为Thread类的参数构造方法启动多线程线程有两种实现方案:继承Thread类实现Runnable接口与继承Thread类相比,实现Runnable接口的好处:避免Java单继承的局限性适合相同的多个代码程序处理同一个资源3.设置和获取线程名Thread类中设置和获取线程名的方法voidsetName(Stringname):set把这个线程的名字改成等于参数名StringgetName():返回本线程的名称线程名称也可以通过构造方法设置如何获取main()方法所在线程的名称?对已执行线程对象的引用4.线程调度线程有两种调度模型。分时调度模型:所有线程轮流使用CPU的使用权,每个线程平均占用CPU的时间片。抢占式调度模型:优先让高级线程使用CPU。如果线程具有相同的优先级,将随机选择一个。优先级高的线程获得更多的CPU时间片。Java使用抢占式调度模型。如果计算机只有一个CPU,那么该CPU在某一时刻只能执行一条指令,线程只有获得CPU时间片,即使用权,才能执行该指令。所以,多线程程序的执行是随机的,因为谁抢到了CPU的使用权是不确定的。Thread类中设置和获取线程优先级的方法publicfinalintgetPriority():返回本线程的优先级。publicfinalvoidsetPriority(intnewPriority):改变这个线程的优先级。线程默认优先级为5;线程优先级的范围是:1-10。只有多次或多次运行才能看到你想要的效果。5.线程控制方法名称说明staticvoidsleep(longmillis)使当前正在执行的线程停留(暂停执行)指定的毫秒数voidjoin()等待本线程死亡。voidsetDaemon(booleanon)将此线程标记为守护线程。当运行的线程都是守护线程时,Java虚拟机会退出6.同步代码块锁定多个语句操作共享数据,可以使用同步代码块实现格式:synchronized(anyobject){多个语句操作共享数据代码}synchronized(anyobject):相当于给代码加锁,任意对象都可以看成是加锁同步利弊●优点:解决多线程的数据安全问题●缺点:线程多时,每个线程会在同步上判断锁,非常耗费资源,无形中会降低程序的运行效率。7、同步方法同步方法:就是在方法中加上synchronized关键字格式:修饰符synchronized返回值类型方法名(方法参数){}同步方法的锁对象是什么?静态方法加synchronized关键字格式:修饰符staticsynchronized返回值类型方法名(方法参数){}synchronized静态方法的锁对象是什么?类名.class8。线程安全类StringBuffer线程安全,可变字符序列●从JDK5版本开始,被StringBuilder取代。通常应该使用StringBuilder类,因为它支持所有相同的操作,但速度更快,因为它不执行同步Vector:从Java2平台v1.2开始,该类改进了List接口,使其成为JavaCollections框架成员。与新的集合实现不同,Vector是同步的。如果不需要线程安全的实现,建议使用ArrayList而不是VectorHashtable:●这个类实现了一个哈希表,它将键映射到值。任何非空对象都可以用作键或值。●从Java2platformv1.2开始,改进了该类实现了Map接口,成为JavaCollectionsFramework的一员。与新的集合实现不同,Hashtable是同步的。如果不需要线程安全的实现,建议使用HashMap而不是Hashtable。9.Lock锁虽然我们可以理解同步代码块的锁对象问题和同步方法,但是我们并没有看在什么地方加锁,在什么地方释放锁。为了更清楚地表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象LockLock实现,以提供比使用synchronized方法和语句更广泛的加锁操作。Lock提供获取和释放锁的方法。voidlock():获取锁voidunlock():释放锁Lock是一个不能直接实例化的接口。这里使用实现类ReentrantLock来实例化ReentrantLock的构造方法ReentrantLock():创建ReentrantLock的实例10.生产者消费者模型概述生产者消费者模型是一种非常经典的多线程协作模式,而理解了生产者-消费者问题,可以让我们对多线程编程有更深的理解。所谓生产者-消费者问题,其实包括两种线程:一种是生产数据的生产者线程,一种是消费数据的消费者线程,为了解耦生产者和消费者之间的关系,通常使用共享数据区是像一个仓库。生产者生产数据后,直接放在公共数据区。它不需要关心消费者的行为。消费者只需要从共享数据区获取数据,不需要关心生产者的行为为了体现生产和消费过程中的等待和唤醒,Java提供了几种方法供我们使用。这些方法是Objec类中Object类的等待和唤醒方法:方法名称说明voidwait()导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAil()方法voidnotify()唤醒在对象监视器上等待的单个线程voidnotifyAil()唤醒在对象监视器上等待的所有线程网络编程一、网络编程概述网络编程:在网络通信协议下,运行的程序之间可以进行数据交换在实现网络互连的不同计算机上。网络编程的三要素:IP地址:为了让网络中的计算机能够相互通信,必须给每台计算机分配一个标识号,通过它指定接收数据的计算机和识别发送方的计算机,并且IP地址就是这个标识号。是设备的标识端口:●网络的通信本质上是两个应用程序的通信。每台计算机都有很多应用程序,那么在网络通信时如何区分这些应用程序呢?如果IP地址可以唯一标识网络中的设备,那么端口号可以唯一标识设备中的应用程序。即应用程序的识别协议:可以通过计算机网络连接多台计算机。同一网络中的计算机在连接??和通信时需要遵守一定的规则,就像汽车行驶在路上一样。与遵守交通规则相同。在计算机网络中,这些连接和通信的规则称为网络通信协议,它对数据传输格式、传输速率、传输步骤等作出统一规定,通信双方必须同时遵守。来完成数据交换。常见的协议有UDP协议和TCP协议2.IP地址IP地址:是设备在网络中的唯一标识IP地址分为两类●IPv4:为每台连接到网络的主机分配一个32位的地址。按照TCP/IP规定,IP地址用二进制表示,每个IP地址的长度为32位,即4个字节。例如一个二进制形式的IP地址是“11000000101010000000000101000010”,这么长的地址处理起来太费力了。为方便使用,IP地址常以十进制形式书写,中间加符号“.”。用于分隔不同的字节。因此,上述IP地址可以是“192.168.1.66”。IP地址的这种表示法称为“点分十进制表示法”,显然比1和0要好记得多。●IPv6:由于互联网的蓬勃发展,对IP地址的需求量越来越大,但是网络地址资源有限,使得IP的分配越来越紧张。为了扩展地址空间,通过IPv6重新定义了地址空间,使用128位地址长度,每组16字节分成8组16进制数,解决了网络地址资源不足的问题。常用命令:ipconfig:查看本机IP地址pingIP地址:查看网络是否连通特殊IP地址:127.0.0.1:为环回地址,可以代表本机地址,一般用于测试。3.InetAddress的使用为了方便我们获取和操作IP地址,Java提供了一个类InetAddress供我们使用InetAddress:这个类表示网际协议(IP)地址方法名描述staticInetAddressgetByName(Stringhost)来确定主机名IP地址。主机名可以是机器名或IP地址。StringgetHostName()获取此IP地址的主机名。StringgetHostAddress()返回文本显示中的IP地址字符串。4.端口和协议端口:应用在设备上的唯一标识端口号:两个字节表示的整数,取值范围为0~65535。其中0~1023之间的端口号用于知名的网络服务和应用,普通应用应该使用1024以上的端口号。如果该端口号被其他服务或应用占用,会导致当前程序无法运行启动失败。协议:在计算机网络中,连接和通信的规则称为网络通信协议UDP协议:用户数据报协议(UserDatagramProtocol)UDP是一种无连接的通信协议,即在数据传输过程中,发送端和接收端数据端不建立逻辑连接。简单来说,当一台计算机向另一台计算机发送数据时,发送端不会确认接收端是否存在,而将数据发送出去。同样,当接收端接收到数据时,也不会向发送端反馈是否接收到数据。.由于UDP协议消耗资源少,通信效率高,通常用于音频、视频和普通数据的传输。●例如视频会议通常采用UDP协议,因为在这种情况下,即使偶尔丢失一两个数据包,也不会对接收结果造成太大影响。但是在使用UDP协议传输数据时,由于UDP的无连接特性,无法保证数据的完整性,所以在传输重要数据时不推荐使用UDP协议。TCP协议:●传输控制协议(TransmissionControlProtocol)●TCP协议是一种面向连接的通信协议,即在传输数据之前,在发送端和接收端之间建立逻辑连接,然后传输数据.它提供两台计算机之间的连接。可靠且无差错的数据传输。在TCP连接中,必须明确定义客户端和服务器。客户端向服务器发送连接请求。每次建立连接,都需要进行一次“三次握手”Three-wayhandshake:在TCP协议中,在发送数据的准备阶段,客户端与服务器进行三次交互,以保证可靠的连接。第一次握手,客户端向服务器发送连接请求,等待服务器确认第二次握手,服务器向客户端发回响应,通知客户端接受在连接请求的第三次握手时,客户端再次向服务器发送确认消息以确认连接。●三次握手完成并建立连接后,客户端和服务器端就可以开始数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全性,因此得到了广泛的应用。如上传文件、下载文件、浏览网页等。5、UDP通信程序UDP通信原理:UDP协议是一种不可靠的网络协议。它在通信的两端都建立了一个Socket对象,但这两个Socket只是发送和接收数据的对象,所以对于基于UDP协议的通信双方来说,并没有所谓的客户端和服务器的概念。Java提供了DatagramSocket类作为基于UDP协议的SocketUDP来发送数据:发送数据的步骤①在发送端创建一个Socket对象(DatagramSocket)DatagramSocket()②创建数据,并将数据打包DatagramPacket(byte[]buf,intlength,InetAddressaddress,intport)③调用DatagramSocket对象的方法发送数据voidsend(DatagramPacketp)④关闭发送方voidclose()UDP接收数据接收数据的步骤①在接收端创建Socket对象(DatagramSocket)DatagramSocket(intport)②创建接收数据的数据包DatagramPacket(byte[]buf,intlength)③调用DatagramSocket对象接收数据的方法voidreceive(DatagramPacketp)④解析数据包,并显示console上的数据为byte[]getData()intgetLength()⑤关闭接收者voidclose()6.TCP通信程序TCP通信原理:TCP通信协议是一种可靠的网络协议,它在通信时建立一个Socket对象在通信的两端形成一个网络虚链路。一旦建立了虚拟网络链接,两端的程序就可以通过虚拟链接进行通信。Java提供了一个基于TCP协议的网络。良好的封装,使用Socket对象来表示两端的通信端口,通过Socket生成IO流进行网络通信。Java为客户端提供了Socket类,为服务器端提供了ServerSocket类。TCP发送数据:发送数据步骤①创建客户端的Socket对象(Socket)Socket(Stringhost,intport)②获取输出流,写入数据OutputStreamgetOutputStream()③释放资源voidclose()TCP接收数据:接收数据步骤①创建服务器端一个Socket对象(ServerSocket)ServerSocket(intport)②监听客户端连接,返回一个Socket对象Socketaccept()③获取输入流,读取数据,在控制台显示数据InputStreamgetInputStream()④释放资源voidclose()