我有一个数组中的主机列表,表示可用于执行特定作业的服务器.目前,我只是通过列表查找和建立与主机的通信来检查它不忙.如果不是,我会派一份工作给它.这种方法往往意味着列表中的第一个主机往往会随着其他可用主机的负载不平衡而变得很热.
在伪代码
for (Host h : hosts) { //checkstatus if status == job accepted break; }
我想在主机之间正确平衡这个负载,即第一次使用主机一次使用第二次该方法主机2.只是想知道最优雅的解决方案是?
谢谢
w ^
解决方法
您可以创建一种提供循环迭代的新类型的Iterable:
public class RoundRobin<T> implements Iterable<T> { private List<T> coll; public RoundRobin(List<T> coll) { this.coll = coll; } public Iterator<T> iterator() { return new Iterator<T>() { private int index = 0; @Override public boolean hasNext() { return true; } @Override public T next() { T res = coll.get(index); index = (index + 1) % coll.size(); return res; } @Override public void remove() { throw new UnsupportedOperationException(); } }; } }
您需要将您的主机定义为RoundRobin< Host> ;. [FIXED基于Mirko的评论]