public final class DefaultEventExecutorChooserFactory implements EventExecutorChooserFactory {
//单例模式
public static final DefaultEventExecutorChooserFactory INSTANCE = new DefaultEventExecutorChooserFactory();
private DefaultEventExecutorChooserFactory() { }
@Override
//根据数组长度选择EventExecutorChooser实力
public EventExecutorChooser newChooser(EventExecutor[] executors) {
//如果是2的幂次,则用PowerOfTwoEventExecutorChooser
if (isPowerOfTwo(executors.length)) {
return new PowerOfTwoEventExecutorChooser(executors);
} else {
//否则用GenericEventExecutorChooser
return new GenericEventExecutorChooser(executors);
}
}
//判断是够是2的幂次
private static boolean isPowerOfTwo(int val) {
return (val & -val) == val;
}
//2的幂次选择器
private static final class PowerOfTwoEventExecutorChooser implements EventExecutorChooser {
//原子自增
private final AtomicInteger idx = new AtomicInteger();
private final EventExecutor[] executors;
PowerOfTwoEventExecutorChooser(EventExecutor[] executors) {
this.executors = executors;
}
//可并发的轮训算法,返回的值不会超过素组的长度
//&运算效率较高
@Override
public EventExecutor next() {
return executors[idx.getAndIncrement() & executors.length - 1];
}
}
//普通选择器
private static final class GenericEventExecutorChooser implements EventExecutorChooser {
//原子自增
private final AtomicInteger idx = new AtomicInteger();
private final EventExecutor[] executors;
GenericEventExecutorChooser(EventExecutor[] executors) {
this.executors = executors;
}
@Override
public EventExecutor next() {
//可并发的轮训算法,返回的值不会超过素组的长度
//计数器不断自增 然后与素组长度取模 最后拿绝对值
return executors[Math.abs(idx.getAndIncrement() % executors.length)];
}
}
}