背景:一个EventExecutorGroup由多个EventExecutor组成,每次从EventExecutorGroup中获取EventExecutor的逻辑由EventExecutorChooser决定,主要有两种策略。
实现逻辑
首先判断数组容量是否为2的幂次方,若是,通过位运算提高计算效率。
编程技巧:
- 2的幂次方的判断;
- 取余时,整数溢出时的考虑与处理;
import java.util.concurrent.atomic.AtomicInteger;
import io.netty.util.concurrent.EventExecutor;
import io.netty.util.concurrent.SingleThreadEventExecutor;
public class MultithreadEventExecutorGroup {
private final EventExecutor[] children;
private final AtomicInteger childIndex = new AtomicInteger();
private final EventExecutorChooser chooser;
public MultithreadEventExecutorGroup(int nThreads) {
children = new SingleThreadEventExecutor[nThreads];
if (isPowerOfTwo(children.length)) {
chooser = new PowerOfTwoEventExecutorChooser();
} else {
chooser = new GenericEventExecutorChooser();
}
}
public EventExecutor next() {
return chooser.next();
}
/**
* 功能:判断val是否为2的幂次方
**/
private static boolean isPowerOfTwo(int val) {
return (val & -val) == val;
}
private interface EventExecutorChooser {
EventExecutor next();
}
private final class PowerOfTwoEventExecutorChooser implements EventExecutorChooser {
@Override
public EventExecutor next() {
//位运算提高索引效率
return children[childIndex.getAndIncrement() & children.length - 1];
}
}
private final class GenericEventExecutorChooser implements EventExecutorChooser {
@Override
public EventExecutor next() {
//防止childIndex溢出
return children[Math.abs(childIndex.getAndIncrement() % children.length)];
}
}
}