权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现2

1. 一般轮询算法

服务器类

Java代码   收藏代码
  1. package com.sosop.roundRobin;  
  2.   
  3. public class Server {  
  4.     private String ip;  
  5.     private int weight;  
  6.       
  7.     public Server(String ip) {  
  8.         super();  
  9.         this.ip = ip;  
  10.     }  
  11.   
  12.     public Server(String ip, int weight) {  
  13.         this.ip     = ip;  
  14.         this.weight = weight;  
  15.     }  
  16.       
  17.     public String getIp() {  
  18.         return ip;  
  19.     }  
  20.     public void setIp(String ip) {  
  21.         this.ip = ip;  
  22.     }  
  23.     public int getWeight() {  
  24.         return weight;  
  25.     }  
  26.     public void setWeight(int weight) {  
  27.         this.weight = weight;  
  28.     }  
  29.   
  30.     @Override  
  31.     public String toString() {  
  32.         return "Server [ip=" + ip + ", weight=" + weight + "]";  
  33.     }     
  34. }  

 实现与测试

Java代码   收藏代码
  1. package com.sosop.roundRobin;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.concurrent.BrokenBarrierException;  
  6. import java.util.concurrent.CyclicBarrier;  
  7.   
  8. public class NormalRoundRobin {  
  9.       
  10.     private List<Server> servers;  
  11.       
  12.     private int currentIndex;  
  13.     private int totalServer;  
  14.       
  15.     public NormalRoundRobin() {  
  16.         servers = new ArrayList<>();  
  17.         servers.add(new Server("192.168.1.2"));  
  18.         servers.add(new Server("192.168.1.3"));  
  19.         servers.add(new Server("192.168.1.4"));  
  20.         servers.add(new Server("192.168.1.5"));  
  21.         servers.add(new Server("192.168.1.6"));  
  22.         servers.add(new Server("192.168.1.7"));  
  23.         servers.add(new Server("192.168.1.8"));  
  24.         totalServer = servers.size();  
  25.         currentIndex = totalServer - 1;  
  26.     }  
  27.   
  28.   
  29.     // 轮询  
  30.     public Server round() {  
  31.         currentIndex = (currentIndex + 1) % totalServer;  
  32.         return servers.get(currentIndex);  
  33.     }  
  34.       
  35.       
  36.     public static void main(String[] args) {  
  37.         final NormalRoundRobin r = new NormalRoundRobin();  
  38.         // 不带并发的轮询  
  39.         for (int i = 0; i < 14; i++) {  
  40.             System.out.println(r.round());  
  41.         }  
  42.           
  43.         System.out.println();  
  44.         System.out.println("==========================");  
  45.         System.out.println();  
  46.           
  47.         final CyclicBarrier b = new CyclicBarrier(14);  
  48.           
  49.         // 带并发的轮询  
  50.         for (int i = 0; i < 14; i++) {  
  51.             new Thread(new Runnable() {  
  52.                 @Override  
  53.                 public void run() {  
  54.                     try {  
  55.                         b.await();  
  56.                         System.out.println(Thread.currentThread().getName() + " " + r.round());  
  57.                     } catch (InterruptedException | BrokenBarrierException e) {  
  58.                         e.printStackTrace();  
  59.                     }  
  60.                 }  
  61.             }, "thread" + i).start();  
  62.         }  
  63.     }  
  64.       
  65. }  

结果:

Server [ip=192.168.1.2, weight=0]
Server [ip=192.168.1.3, weight=0]
Server [ip=192.168.1.4, weight=0]
Server [ip=192.168.1.5, weight=0]
Server [ip=192.168.1.6, weight=0]
Server [ip=192.168.1.7, weight=0]
Server [ip=192.168.1.8, weight=0]
Server [ip=192.168.1.2, weight=0]
Server [ip=192.168.1.3, weight=0]
Server [ip=192.168.1.4, weight=0]
Server [ip=192.168.1.5, weight=0]
Server [ip=192.168.1.6, weight=0]
Server [ip=192.168.1.7, weight=0]
Server [ip=192.168.1.8, weight=0]

==========================

thread13 Server [ip=192.168.1.2, weight=0]
thread4 Server [ip=192.168.1.6, weight=0]
thread3 Server [ip=192.168.1.5, weight=0]
thread1 Server [ip=192.168.1.3, weight=0]
thread12 Server [ip=192.168.1.7, weight=0]
thread0 Server [ip=192.168.1.2, weight=0]
thread2 Server [ip=192.168.1.4, weight=0]
thread10 Server [ip=192.168.1.6, weight=0]
thread11 Server [ip=192.168.1.5, weight=0]
thread8 Server [ip=192.168.1.3, weight=0]
thread9 Server [ip=192.168.1.4, weight=0]
thread7 Server [ip=192.168.1.2, weight=0]
thread6 Server [ip=192.168.1.8, weight=0]
thread5 Server [ip=192.168.1.7, weight=0]

 

2.加权轮询

Java代码   收藏代码
  1. package com.sosop.roundRobin;  
  2.   
  3. import java.math.BigInteger;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.concurrent.BrokenBarrierException;  
  7. import java.util.concurrent.CyclicBarrier;  
  8.   
  9. public class WeightRoundRobin {  
  10.     private List<Server> servers;  
  11.   
  12.     private int currentIndex;  
  13.     private int totalServer;  
  14.     private int currentWeight;  
  15.     private int maxWeight;  
  16.     private int gcdWeight;  
  17.   
  18.     public WeightRoundRobin() {  
  19.         servers = new ArrayList<>();  
  20.         servers.add(new Server("192.168.1.2"5));  
  21.         servers.add(new Server("192.168.1.3"10));  
  22.         servers.add(new Server("192.168.1.4"15));  
  23.         servers.add(new Server("192.168.1.5"100));  
  24.         servers.add(new Server("192.168.1.6"5));  
  25.         servers.add(new Server("192.168.1.7"20));  
  26.         servers.add(new Server("192.168.1.8"30));  
  27.         totalServer = servers.size();  
  28.         currentIndex = totalServer - 1;  
  29.         maxWeight = maxWeight();  
  30.         gcdWeight = serverGcd();  
  31.     }  
  32.   
  33.     public Server round() {  
  34.         while (true) {  
  35.             currentIndex = (currentIndex + 1) % totalServer;  
  36.             if (currentIndex == 0) {  
  37.                 currentWeight = currentWeight - gcdWeight;  
  38.                 if (currentWeight <= 0) {  
  39.                     currentWeight = maxWeight;  
  40.                     if(currentWeight == 0) {  
  41.                         return null;  
  42.                     }  
  43.                 }  
  44.             }  
  45.               
  46.             if(servers.get(currentIndex).getWeight() >= currentWeight) {  
  47.                 return servers.get(currentIndex);  
  48.             }  
  49.         }  
  50.     }  
  51.   
  52.     /** 
  53.      * 返回所有服务器的权重的最大公约数 
  54.      *  
  55.      * @return 
  56.      */  
  57.     private int serverGcd() {  
  58.         int comDivisor = 0;  
  59.         for (int i = 0; i < totalServer - 1; i++) {  
  60.             if (comDivisor == 0) {  
  61.                 comDivisor = gcd(servers.get(i).getWeight(), servers.get(i + 1).getWeight());  
  62.             } else {  
  63.                 comDivisor = gcd(comDivisor, servers.get(i + 1).getWeight());  
  64.             }  
  65.         }  
  66.         return comDivisor;  
  67.     }  
  68.   
  69.     /** 
  70.      * 获得服务器中的最大权重 
  71.      *  
  72.      * @return 
  73.      */  
  74.     private int maxWeight() {  
  75.         int max = servers.get(0).getWeight();  
  76.         int tmp;  
  77.         for (int i = 1; i < totalServer; i++) {  
  78.             tmp = servers.get(i).getWeight();  
  79.             if (max < tmp) {  
  80.                 max = tmp;  
  81.             }  
  82.         }  
  83.         return max;  
  84.     }  
  85.   
  86.     /** 
  87.      * 求两个数的最大公约数 4和6最大公约数是2 
  88.      *  
  89.      * @param num1 
  90.      * @param num2 
  91.      * @return 
  92.      */  
  93.     private int gcd(int num1, int num2) {  
  94.         BigInteger i1 = new BigInteger(String.valueOf(num1));  
  95.         BigInteger i2 = new BigInteger(String.valueOf(num2));  
  96.         return i1.gcd(i2).intValue();  
  97.     }  
  98.   
  99.     public static void main(String[] args) {  
  100.         final WeightRoundRobin wr = new WeightRoundRobin();  
  101.         // 非并发情况  
  102.         for (int i = 0; i < 100; i++) {  
  103.             System.out.println(wr.round());  
  104.         }  
  105.           
  106.         System.out.println();  
  107.         System.out.println("==========");  
  108.         System.out.println();  
  109.           
  110.         final CyclicBarrier b = new CyclicBarrier(30);  
  111.         // 并发情况  
  112.         for (int i = 0; i < 30; i++) {  
  113.             new Thread(new Runnable() {  
  114.                 @Override  
  115.                 public void run() {  
  116.                     try {  
  117.                         b.await();  
  118.                         System.out.println(Thread.currentThread().getName() + " " + wr.round());  
  119.                     } catch (InterruptedException | BrokenBarrierException e) {  
  120.                         e.printStackTrace();  
  121.                     }  
  122.                 }  
  123.             }, "thread" + i).start();  
  124.         }  
  125.     }  
  126. }  

 

结果:

Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.3, weight=10]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.2, weight=5]
Server [ip=192.168.1.3, weight=10]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.6, weight=5]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.3, weight=10]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.2, weight=5]
Server [ip=192.168.1.3, weight=10]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.6, weight=5]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.3, weight=10]

==========

thread0 Server [ip=192.168.1.5, weight=100]
thread3 Server [ip=192.168.1.2, weight=5]
thread7 Server [ip=192.168.1.6, weight=5]
thread10 Server [ip=192.168.1.5, weight=100]
thread12 Server [ip=192.168.1.5, weight=100]
thread15 Server [ip=192.168.1.5, weight=100]
thread18 Server [ip=192.168.1.5, weight=100]
thread2 Server [ip=192.168.1.8, weight=30]
thread29 Server [ip=192.168.1.5, weight=100]
thread1 Server [ip=192.168.1.7, weight=20]
thread27 Server [ip=192.168.1.8, weight=30]
thread26 Server [ip=192.168.1.5, weight=100]
thread25 Server [ip=192.168.1.8, weight=30]
thread24 Server [ip=192.168.1.5, weight=100]
thread23 Server [ip=192.168.1.5, weight=100]
thread22 Server [ip=192.168.1.5, weight=100]
thread21 Server [ip=192.168.1.5, weight=100]
thread20 Server [ip=192.168.1.5, weight=100]
thread19 Server [ip=192.168.1.5, weight=100]
thread17 Server [ip=192.168.1.5, weight=100]
thread16 Server [ip=192.168.1.5, weight=100]
thread14 Server [ip=192.168.1.5, weight=100]
thread13 Server [ip=192.168.1.5, weight=100]
thread11 Server [ip=192.168.1.5, weight=100]
thread9 Server [ip=192.168.1.8, weight=30]
thread8 Server [ip=192.168.1.7, weight=20]
thread6 Server [ip=192.168.1.5, weight=100]
thread5 Server [ip=192.168.1.4, weight=15]
thread4 Server [ip=192.168.1.3, weight=10]
thread28 Server [ip=192.168.1.5, weight=100]

猜你喜欢

转载自m635674608.iteye.com/blog/2396303