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)]; // 通过取余实现
}
}