1 SelectStrategy接口
提供了一个能力去控制select loop的行为。
1.1 方法签名:
int calculateStrategy(IntSupplier selectSupplier, boolean hasTasks) throws Exception;
用于在select调用之后,决定以什么样的方式去处理select的结果;
1.2 入参:
selectSupplier 这个接口返回的是select调用的返回值是一个int;
hasTasks 是否有任务等待着被执行;
1.3 返回值
int SELECT = -1;表明接下来应该去调阻塞型的select
int CONTINUE = -2;表明下一步应该去重试io loop
int BUSY_WAIT = -3;表明接下来应该去调非阻塞的select;
返回值大于等于0,则表明现在应该去处理几个就绪的channel;
2 SelectStrategy的默认实现DefaultSelectStrategy
netty中SelectStrategy是一个接口,你可以去定制你的实现,并且通过设置你的实现,去让netty去采用你的实现,但是如果你不需要去定制,那么netty会采用它提供的默认实现:DefaultSelectStrategy。
final class DefaultSelectStrategy implements SelectStrategy {
static final SelectStrategy INSTANCE = new DefaultSelectStrategy();
private DefaultSelectStrategy() { }
@Override
public int calculateStrategy(IntSupplier selectSupplier, boolean hasTasks) throws Exception {
return hasTasks ? selectSupplier.get() : SelectStrategy.SELECT;
}
}
如上看到,static 直接初始化出一个DefaultSelectStrategy的实例;
如果当前没有任务,也就是hasTasks=false,那么就会返回SelectStrategy.SELECT,如果有任务的话,则会返回select的结果值;
3 SelectStrategyFactory
是一个接口用于生产SelectStrategy;
代码:
public interface SelectStrategyFactory {
/**
* Creates a new {@link SelectStrategy}.
*/
SelectStrategy newSelectStrategy();
}
4 DefaultSelectStrategyFactory
SelectStrategyFactory的默认实现,每次都返回同一个DefaultSelectStrategy实例:
public final class DefaultSelectStrategyFactory implements SelectStrategyFactory {
public static final SelectStrategyFactory INSTANCE = new DefaultSelectStrategyFactory();
private DefaultSelectStrategyFactory() { }
@Override
public SelectStrategy newSelectStrategy() {
return DefaultSelectStrategy.INSTANCE;
}
}