我现在想做个类似于负载均衡轮询,目前只需要rr 轮叫(Round Robin)这种最简单的方式,即什么都不用管,1显示完了,下次访问显示2,再显示3,都显示完了,再轮回到1,于是我做了下面一个小例子,我知道我需要一个东西来保存我上次访问的位置,就叫访问位置因子吧,我不需要文件或者数据库这种额外的存储介质,我只要放到内存中。
问题来了,下面的例子始终会打印1,而不是1,2,1,2.....,这是因为每次又把i重新设置为了-1,我想知道我怎样存储这个访问位置因子(i),比如我访问过0位置,那么下次访问i是从0开始的,而不是-1,谢谢
public static Integer i ; static{
i = -1;
} public static void main(String[] args) {
Vector<Integer> v = new Vector<Integer>();
v.add(1);
v.add(2);
i = (i +1)%v.size();
System.out.println(v.get(i));
i ++;
if(i >= v.size())
i = -1;
}

解决方案 »

  1.   

    感觉不是太明白楼上的意思
    只是需要一个变量而已 为什么连Vector 都弄出了呢
      

  2.   

    我是想轮询显示vector中的元素,比如第一次访问显示第一个,下次访问显示第二个,显示到最后一个时候,再访问就显示第一个。vertor线程安全
      

  3.   


    class Number{

    private static int number = 1;

    public static int getNumber(){
    if(number > 2) number >>= 1;
    return number++;
    }

    }
    这个貌似可以得到你要求的 12121212...
      

  4.   

    大概理解了楼主的需求
    不知这样可否 private static int index = 0;

    public static void main(String[] args) {
    Vector<Integer> v = new Vector<Integer>();
            v.add(1);
            v.add(2);
            System.out.println(v.get(index++));
            if(index >= v.size())
             index = 0;
    }
      

  5.   

    楼上的,这样访问,每次都是1,因为每次都把index=0了,这是不是不能在一个class里面去调用,有人知道apache处理负载均衡的源码吗?
      

  6.   

    我貌似知道了,其实原理很简单,这个东西放到一个静态变量中保存就行,但是我模拟的方式不对吧,我是不是应该用多线程去模拟,而不是每次都跑一个main函数
      

  7.   

    逻辑上有问题
    i = (i +1)%v.size();
    为什么还要给i付值呢?
    这样弄i不是逐一递增了。所以你把取第二个元素的case给过滤掉了第一次
    i = -1
    i = (i +1)%v.size();后
    i=0
    取向量值后 i++ 
    i = 1第二次
    i = 1
    i = (i +1)%v.size();后
    i=0
    取向量值后 i++ 
    i = 1如此,始终get(0);
      

  8.   


    恩,这才是问题所在
    你每次都用main跑,当然结果一样开多线程就不一样了,试试吧
      

  9.   

    谢谢大家,我太白痴了,我把这个代码放到了一个jsp,用tomcat去加载,static变量被容器加载初始化一次就不会再初始化了,这样就相当于模拟了多线程去访问共享变量了,切忌以后不要在main函数去测试这种逻辑。
      

  10.   

    有解啊。。<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.util.*"%>
    <%!
    private static int index = -1; 
    %><%
            Vector<Integer> v = new Vector<Integer>();
            v.add(1);
            v.add(2);
            out.println(v.get(++index));
            if(index >= v.size()-1)
                index = -1;
    %>你放到resin或者tomcat中看看,是不是1,2,1,2静态变量共享内存空间