DefaultEventExecutorChooserFactory
构造函数
public static final DefaultEventExecutorChooserFactory INSTANCE = new DefaultEventExecutorChooserFactory();
private DefaultEventExecutorChooserFactory() { }
newChooser
策略模式
public EventExecutorChooser newChooser(EventExecutor[] executors) {
if (isPowerOfTwo(executors.length)) {
return new PowerOfTwoEventExecutorChooser(executors);
} else {
return new GenericEventExecutorChooser(executors);
}
}
isPowerOfTwo
/** 1 2 4 8 16 ....... */
private static boolean isPowerOfTwo(int val) {
return (val & -val) == val;
}
PowerOfTwoEventExecutorChooser
性能比GenericEventExecutorChooser好
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() {// -的 优先级高于& (executors.length - 1 后每位都是1)
return executors[idx.getAndIncrement() & executors.length - 1]; // 通过位操作实现 1-1=0 10(二进制)-1=1 100(二进制)-1=11 1000(二进制)-1=111
}
}
GenericEventExecutorChooser
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)]; // 通过取余实现
}
}