本文主要是介绍《Java源码解析》之NIO的Selector机制(Part3:Selector.select()),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Selector.select()函数的分析:
前面已经介绍过了Selector的open函数以及channel的register函数,现在分析最后一个函数:select()函数。
selector.select()在Selector类中此方法是一个抽象的。如下:
public abstract int select() throws IOException;
函数功能:选择一些I/O操作已经准备好的channel。每个channel对应着一个key。这个方法是一个阻塞的选择操作。当至少有一个通道被选择时才返回。当这个方法被执行时,当前线程是允许被中断的。
除了这个方法之外,还有两个重载方法:
1. public abstract int select(long timeout)throws IOException;
2. public abstract int selectNow() throws IOException;
- select(long timeout)
select(long timeout)和select()一样,除了最长会阻塞timeout毫秒(参数)。
这个方法并不能提供精确时间的保证,和当执行wait(long timeout)方法时并不能保证会延时timeout道理一样。
这里的timeout说明如下:
- 如果 timeout为正,则select(long timeout)在等待有通道被选择时至多会阻塞timeout毫秒
- 如果timeout为零,则永远阻塞直到有至少一个通道准备就绪。
- timeout不能为负数
- selectNow()
这个方法与select()的区别在于,是非阻塞的,即当前操作即使没有通道准备好也是立即返回。只是返回的是0.
值得注意的是:调用这个方法会清除所有之前执行了wakeup方法的作用。
下面来看select()函数的具体实现:
首先我们来看一下这三个方法的实现:是在SelectorImpl这个类里面:
public int select
这篇关于《Java源码解析》之NIO的Selector机制(Part3:Selector.select())的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!