本文主要是介绍【软件构造】课件精译(二十三)消息传递与图形化用户界面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、套接字&网络:在两台计算机间传递信息
套接字&网络
网络中的Client/server模式,采用socket作为抽象
网络通信是并发的,需要考虑线程安全问题
需要设计client和server通讯用的线路协议
socket的一些阻塞操作使代码编写更容易,但有可能造成死锁
客户端/服务器设计模式
客户端发起通信,服务器接收、处理、回复,重复此过程,客户端断开连接。服务器可同时处理多个客户端,客户端也可同时连接多个服务器。
客户机和服务器可在不同的计算机上,也可在一台计算机上
IP地址
网络接口由IP地址标识。 IPv4地址是以4个8位部分写入的32位数字
主机名
主机名是可以转换为IP地址的名称
端口
服务器进程绑定到特定的端口,在该端口上进行侦听。客户端必须知道服务器正在侦听哪个端口号。
当客户端连接到服务器时,该连接还使用客户端网络接口上的端口号(通常从不常用端 口中随机选择)
网络套接字
socket(套接字)是用于发送和/或接收数据的网络连接中的端点(socket本质是API,对TCP/IP协议的封装)
服务器进程使用侦听套接字等待来自远程客户端的连接
连接成功的套接字可以发送和接收来自连接另一端的进程的消息,通过本地和远程计算机的IP地址和端口号区分两端计算机
Java中的TCP网络——java.net
(因为课程不作考核,时间原因这部分剩余内容省略,重点是有关多线程的第二部分
二、通过线程进行消息传递
Message passing模型用于在客户端和服务器端的进程间通过sockets传递消息
在同一进程的线程间通过message passing传递消息,比通过锁定机制共享内存更受欢迎
使用同步队列在线程之间传递消息
Java是如何支持消息传递的
BlockingQueue支持在检索元素时等待队列变为非空,在存储元素时等待队列中的空间变得可用
当使用BlockingQueue进行消息传递时,确保使用put和take方法,而不是add和remove方法
生产者 - 消费者设计模式
多个生产者和消费者共享一个同步的队列,都可对其写入和读取,需要同步安全机制
两种BlockingQueue的实现
ArrayBlockingQueue:定长队列,队列满时put操作会阻塞
LinkedBlockingQueue:可变长度队列
可以保存任意类型的对象
消息采用不可变类型
避免竞争情况和确保原子操作
银行账户的例子
每台自动提款机和每个帐户都是自己的模块,模块通过相互发送消息进行交互。 传入的消息到达队列。
我们设计了取消余额和取款的消息,并表示每台取款机在取款前检查帐户余额以防止透支:
但它仍然可以交错来自两台取款机的消息,因此它们都被认为可以安全地从一个只有1美元的账户中提取最后一美元。
我们需要选择一个更好的原子操作:撤回 - 如果充足 - 资金将是一个比退出更好的操作。
通过队列实现消息传递
Stopping
如何关闭Squarer?
在C/S模式下, 可以关闭socket以停止客户端或者服务器继续侦听消息
如果期望服务器和客户端同时关闭,可以退出进程
一种不推荐的策略:使用特殊的消息提示结束(如0,或者null),但是魔数或者null都不是推荐的方式
interrupt()
interrupted()检测当前线程是否被中断,如果被中断,返回true,并清除中断标志
消息传递死锁
采用定长队列可以提升性能
为了创建死锁所需的条件,在检查Squarer的任何回复之前,客户端代码将发出N个请求,以获得从1到N的数字的平方。 这是完整的代码:
随着N变得越来越大(远远大于100),我们的客户在没有阅读任何回复的情况下提出了许多请求。
如果N大于QUEUE_SIZE,则回复队列将填满未读回复。 然后Squarerblockstrying再将一个回复放入该队列,并停止调用请求队列。 客户端可以继续将更多请求放入请求队列,但最多只能达到该队列的大小。
如果有更多的额外请求超出该队列的要求 - 即,当N大于2×QUEUE_SIZE-时,客户端对requests.put()的调用也会阻塞。
Squarer在等待客户端读取一些回复并释放回复队列上的空间,但客户端正在等待Squarer接受一些请求并释放请求队列上的空间。 死锁。
消息传递的线程安全参数
队列本身是线程安全的数据类型
传送的数据是不可变的
生产者和消费者内部的数据对外部是不可见的,仅通过消息通讯
如果消息是可变的,则要确保同一时刻只有一个线程能够访问
防止死锁的方案
一个方案是系统设计层面确保不会出现死锁
另外一个方案是终止阻塞并抛出异常
总结
相比通过锁进行同步,消息传递同步是依靠消息通道进行共享
通过阻塞队列的方式是单进程内部线程间通信的有用方式
三、图形用户界面 (GUI)
(因为课程不作考核,时间原因这部分省略
这篇关于【软件构造】课件精译(二十三)消息传递与图形化用户界面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!