SelectStrategy体系

818 阅读1分钟

1 SelectStrategy接口

image.png

提供了一个能力去控制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;
    }
}