Java网络编程核心技术详解(视频微课版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.8 练习题

1.在服务器程序中,线程在哪些情况下可能会进入阻塞状态?(多选)

a)线程执行Socket的getInputStream()方法获得输入流。

b)线程执行Socket的getOutputStream()方法获得输出流。

c)线程执行ServerSocket的accept()方法。

d)线程从Socket的输入流读入数据。

e)线程向Socket的输出流写一批数据。

2.ServerSocketChannel可能发生哪个事件?(单选)

a)SelectionKey.OP_ACCEPT:接收连接就绪事件

b)SelectionKey.OP_CONNECT:连接就绪事件

c)SelectionKey.OP_READ:读就绪事件

d)SelectionKey.OP_WRITE:写就绪事件

3.SocketChannel可能发生哪些事件?(多选)

a)SelectionKey.OP_ACCEPT:接收连接就绪事件

b)SelectionKey.OP_CONNECT:连接就绪事件

c)SelectionKey.OP_READ:读就绪事件

d)SelectionKey.OP_WRITE:写就绪事件

4.对于以下代码,

假定执行socketChannel.read(byteBuffer)方法前,byteBuffer的容量、极限和位置分别为c、l和p,执行完以上代码后,byteBuffer的容量、极限和位置分别是多少?(单选)

a)容量为c,极限为l,位置为p+n

b)容量为c,极限为p+n,位置为0

c)容量为l,极限为p+n,位置为0

d)容量为c,极限为p+n,位置为p+n

5.在哪些情况下,SelectionKey对象会失效?(多选)

a)程序调用SelectionKey的cancel()方法

b)程序调用SelectionKey的close()方法

c)关闭与SelectionKey关联的Channel

d)关闭与SelectionKey关联的Selector

6.线程执行Selector对象的select(long timeout)方法时进入阻塞状态,在哪些情况下,线程会从select()方法中返回?(多选)

a)至少有一个SelectionKey的相关事件已经发生

b)其他线程调用了Selector对象的wakeup()方法

c)与Selector对象关联的一个SocketChannel对象被关闭

d)当前执行select()方法的线程被其他线程中断

e)超出了等待时间

7.在默认情况下,SocketChannel对象处于什么模式?(单选)

a)阻塞模式

b)非阻塞模式

8.SwingWorker类的哪个方法表示由SwingWorker工作线程执行的后台任务?(单选)

a)done()

b)publish()

c)doInBackground()

d)process()

9.运行4.6.3节的AsynEchoClient类,当用户快速在用户界面的文本框中不断进行回车操作后,会有哪些线程在并发运行?(单选)

a)一个main主线程。

b)一个main主线程和一个EDT线程。

b)一个EDT线程和一个SwingWorker工作线程。

d)一个EDT线程和多个来自SwingWorker工作线程池的SwingWorker工作线程。

10.以下哪些选项中的两个线程属于异步执行各自的操作?(多选)

a)线程A不断向一个ByteBuffer缓冲区中写入数据,线程B不断从这个ByteBuffer缓冲区中读取数据。

b)线程A不断向一个ByteBuffer缓冲区中写入数据,线程B一直等待,直到这个缓冲区已经写满后,才开始从缓冲区中读取数据。当线程B从缓冲区读取数据时,线程A开始等待,直到线程B把缓冲区清空。

c)一个SwingWorker工作线程在执行一个SwingWorker对象的doInBackground()方法,而EDT线程在监听图形用户界面触发的事件。

d)一个SwingWorker工作线程在执行一个SwingWorker对象的doInBackground()方法。而EDT线程在执行这个SwingWorker对象的get()方法。

11.编写一个用于诊断网络传输数据准确性的程序。服务器端(exercise.IntgenServer类)不断发送int类型的整数,从0开始递增。客户端(exercise.IntgenClient类)不断接受来自服务器端发送的数据,判断实际收到的数据与预期应该收到的数据是否一致。如果不一致,就说明网络在发送这一int数据的字节序列时存在错误。

服务器和客户端都采用通道来通信。服务器端采用非阻塞模式,而客户端采用阻塞模式。

答案:1.c,d,e 2.a 3.b,c,d 4.b 5.a,c,d 6.a,b,d,e 7.a 8.c 9.d 10.a,c

11.参见配套源代码包的sourcecode/chapter04/src/exercise目录下的IntgenServer和IntgenClient类。

编程提示:服务器端以递增的方式发送int类型的数据,当达到int类型的最大值时,Integer.MAX_VALUE+1的取值为负数(等价于Integer.MIN_VALUE),所以,接下去会继续以递增的方式发送负数。客户端的SocketChannel采用阻塞模式读取数据,读到一个int数据后,就会判断它与预期的数据是否一致,如果不一致,就会打印出错信息,然后接受来自服务器的下一个int数据。因此客户端采用的是同步通信。而服务器端则不必等到客户端已经收到当前int数据,就能继续发送下一个int数据,所以服务器端采用的是异步通信。