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)];
        }
    }
}