加权轮询 Java版

Server

package com.hhdys.bean;

public class Server {
	private String name;
	private int weight;
	private int visitCount;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getWeight() {
		return weight;
	}
	public void setWeight(int weight) {
		this.weight = weight;
	}
	public Server(String name, int weight) {
		super();
		this.name = name;
		this.weight = weight;
		this.visitCount=weight;
	}
	public int getVisitCount() {
		return visitCount;
	}
	public void setVisitCount(int visitCount) {
		this.visitCount = visitCount;
	}
	
	

}

Main

package com.hhdys.test;

import java.util.ArrayList;
import java.util.List;

import com.hhdys.bean.Server;

public class LBTest {
	List<Server> servers=new ArrayList<>();
	int totalWeight=0;
	int gcd=0;
	int curServer=0;
	int curIndex=0;
	
	
	public LBTest() {
		super();
		Server server1=new Server("A", 4);
		Server server2=new Server("B", 2);
		Server server3=new Server("C", 3);
		Server server4=new Server("D", 4);
		servers.add(server1);
		servers.add(server2);
		servers.add(server3);
		servers.add(server4);
		setGcd();
		setTotalWeight();
	}
	
	private void setTotalWeight(){
		for(Server server : servers){
			this.totalWeight+=server.getWeight();
		}
		this.totalWeight/=this.gcd;
		System.out.println("total weight is "+this.totalWeight);
	}
	private int gcd(int x,int y){
		if(x<y){
			return gcd(y,x);
		}
		int result=x%y;
		if(result==0){
			return y; 
		}
		return gcd(y, result);
	}
	
	private void setGcd(){
		int tempGcd=0;
		for(Server server :servers){
			if(tempGcd==0){
				tempGcd=server.getWeight();
				continue;
			}else{
				tempGcd=gcd(tempGcd, server.getWeight());
			}
		}
		this.gcd=tempGcd;
		System.out.println("gcd is "+this.gcd);
	}

	public Server getServer(){
		int serversNum=servers.size();
		if(curIndex>=this.totalWeight){//超过一次轮询
			System.out.println("reset visit info===============");
			curIndex=0;
			curServer=0;
			for(Server server:servers){
				server.setVisitCount(server.getWeight());
			}
		}
		Server server=servers.get(curServer);
		if(judgeServerStatus(server)){
			dealSeleted(server);
			return server;
		}
		while (true) {//轮询到的机器不可用,自动轮询下一台机器
			this.curServer++;
			if(this.curServer>=serversNum){
				this.curServer=0;
			}
			server=servers.get(this.curServer);
			if(judgeServerStatus(server)){
				dealSeleted(server);
				return server;
			}
		}
	}
	
	private void dealSeleted(Server server){
		server.setVisitCount(server.getVisitCount()-this.gcd);
		this.curIndex++;
		this.curServer++;
		if(this.curServer>=servers.size()){
			this.curServer=0;
		}
	}
	
	private boolean judgeServerStatus(Server server){
		if(server==null){
			return false;
		}
		if(server.getVisitCount()>0){
			return true;
		}
		return false;
	}

	public static void main(String[] args){
		long time=System.currentTimeMillis();
		System.out.println("begin=======");
		LBTest test=new LBTest();
		for(int i=0;i<20;i++){
			Server server=test.getServer();
			System.out.println("the server is "+server.getName());
		}
		System.out.println("end========"+(System.currentTimeMillis()-time)/1000);
	}

}

转载于:https://my.oschina.net/hhdys412/blog/811473

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值