
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数据,所以服务器端采用的是异步通信。
