netty源碼之 DefaultEventExecutorChooserFactory 之2的整數次冪設計

package io.netty.util.concurrent;


import io.netty.util.internal.UnstableApi;


import java.util.concurrent.atomic.AtomicInteger;


/**
 * Default implementation which uses simple round-robin to choose next {@link EventExecutor}.
 */
@UnstableApi
public final class DefaultEventExecutorChooserFactory implements EventExecutorChooserFactory {


    public static final DefaultEventExecutorChooserFactory INSTANCE = new DefaultEventExecutorChooserFactory();


    private DefaultEventExecutorChooserFactory() { }


    @SuppressWarnings("unchecked")
    @Override
    public EventExecutorChooser newChooser(EventExecutor[] executors) {
        if (isPowerOfTwo(executors.length)) {
            return new PowerOfTwoEventExecutorChooser(executors);
        } else {
            return new GenericEventExecutorChooser(executors);
        }
    }


    private static boolean isPowerOfTwo(int val) {
        return (val & -val) == val;
    }


    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)];
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章