SelectStrategy体系

 2023-02-07
原文作者:李意文 原文地址:https://juejin.cn/post/7019957202064506893

1 SelectStrategy接口

202212302204575021.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;
        }
    }