轮循机制调度 Java 迭代器

2022-09-03 08:35:05

我在阵列中有一个主机列表,它们表示可用于执行特定工作的服务器。目前,我只是通过列表进行迭代查找并与主机建立通信,以检查它是否不繁忙。如果没有,我会给它发一份工作。此方法往往意味着列表中的第一个主机往往会变得热,负载与其他可用主机无法正确平衡。

在伪代码中 ..

for (Host h : hosts) {

    //checkstatus
    if status == job accepted break;

}

我想在主机之间正确平衡此负载,即第一次使用主机一,第二次使用该方法时主机2。只是想知道最优雅的解决方案是?

谢谢 W


答案 1

您可以创建一种提供轮循机制迭代的新型可迭代:

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>

[根据米尔科的评论修复]


答案 2

Google集合有一个实用方法Iterators.cycle(Iterable<T> iterable),它可以做你想做的事情。