本文共 2023 字,大约阅读时间需要 6 分钟。
1.掌握Java非阻塞通信机制,掌握java.nio中ServerSocketChannel、SocketChannel、Selector、SelectionKey等关键类的使用;
2.掌握使用java.nio包中的类创建非阻塞模式的服务器和客户程序的方法。1. 分析说明
(1)说明导致线程阻塞的主要原因; 答:导致线程阻塞的原因主要有以下几个方面:(2)分析说明java.nio中进行非阻塞通信时,使用的主要类的功能及其相互关系。
答:(1)分析例4-1,说明可能导致线程阻塞的语句。
答: 有以下几点有可能会导致阻塞的发生。 1)服务端等待客户端连接: 线程执行 accept()方法,等待客户的连接,直到收到了客户连接,才从accept()方法返回。 2)线程从Socket的输入流读入数据时,如果没有足够的数据,就会进入阻塞。 Socket的输入流br利用readLine()方法读取一行字符串,如果一直没有数据输入,就会阻塞。 3)线程向Socket的输出流写一批数据时,可能会进入阻塞。 线程向Socket的输出流写一批数据时,由于写数据需要一定的时间,等到输出所有的数据或发生异常,才从输出流的write()方法返回或异常中断。 (2)分析例4-2,图示EchoServer.service方法的主要框架,说明其中主要对象的关系。 在service()方法中,ServerSocketChannel向Selector注册接收连接就绪事件。监听事件发生,将SelectionKey对象加入到selected-keys集合中。利用accept()方法获得与客户连接的SocketChannel对象。SeverSocketChannel向register()方法传递了一个ByteBuffer类型参数,ByteBuffer将作为附件,与新建的SelectionKey对象关联。 (3)改进、调试、运行上述两个例子,给出运行结果及分析说明。 4-1运行结果: 4-2运行结果: 三、实验总结 1.实验过程中遇到的问题及解决办法; 答:在实验过程中,对于阻塞模式和非阻塞通信编程的思路不是很了解 解决:尽管阻塞模式与非阻塞模式都可以同时处理多个客户连接,但阻塞模式需要使用较多的线程,而非阻塞模式只需使用较少的线程,非阻塞模式能更有效地利用CPU,系统开销小,因此有更高的并发性能。阻塞模式比较适用于同步通信,并且通信双方稳定地发送小批量的数据,双方都不需要花很长时间等待对方的回应。非阻塞模式编程相对难一些,对ByteBuffer缓冲区的处理比较麻烦。非阻塞模式比较适用于异步通信,并且通信双方发送大批量的数据,尽管一方接收到另一方的数据可能要花一段时间,但在这段时间内,接收方不必傻傻地等待,可以处理其他事情。转载地址:http://ovmgn.baihongyu.com/