同样的在构造器中看到了SelectStrategyFactory参数,所以先对SelectStrategyFactory类进行解析。

解析

SelectStrategyFactory接口

SelectStrategyFactory接口功能十分简单就是生产Select策略。

1
2
3
4
5
6
public interface SelectStrategyFactory {
/**
* Creates a new {@link SelectStrategy}.
*/
SelectStrategy newSelectStrategy();
}

实现类DefaultSelectStrategyFactory

目前只有一个实现类DefaultSelectStrategyFactory。

DefaultSelectStrategyFactory是一个单例类,同时它生产的Select策略也是单例类(DefaultSelectStrategy)。

1
2
3
4
5
6
7
8
9
10
public final class DefaultSelectStrategyFactory implements SelectStrategyFactory {
public static final SelectStrategyFactory INSTANCE = new DefaultSelectStrategyFactory();

private DefaultSelectStrategyFactory() { }

@Override
public SelectStrategy newSelectStrategy() {
return DefaultSelectStrategy.INSTANCE;
}
}

SelectStrategy接口

SelectStrategy提供了控制select循环的能力,比如:
如果有事件要立即处理,一个堵塞的select操作能够被延迟或者完全停止。

1
2
3
4
5
6
7
8
9
10
public interface SelectStrategy {
// 接下来应该是阻塞选择
int SELECT = -1;
// 应重试id循环,无阻塞选择应该跟随
int CONTINUE = -2;
// io循环在不阻塞的情况下轮询新事件
int BUSY_WAIT = -3;
// 可用于控制潜在的选择结果
int calculateStrategy(IntSupplier selectSupplier, boolean hasTasks) throws Exception;
}

实现类DefaultSelectStrategy

和DefaultSelectStrategyFactory一样也是一个单例类,它的实现非常简单:有任务的时候交由传入的IntSupplier类实现,不然直接返回SelectStrategy.SELECT。

1
2
3
4
5
6
7
8
9
10
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;
}
}