看到很多分布式框架有竞选leader的环节,就自己写代码演示一下
仅演示用,不能用于真实业务。
程序运行结果如下:
1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Random; 4 5 //https://www.cnblogs.com/cheng2839/ 6 public class NodeTest { 7 8 public static void main(String[] args) { 9 List<Node> nodeList = new ArrayList<>(20); 10 for (int i = 0; i < 10; i++) { 11 Node node = new Node(); 12 node.name = "节点"+i; 13 node.nodeList = nodeList; 14 nodeList.add(node); 15 } 16 17 new Thread( 18 () -> { 19 Node leader = null; 20 searchFirstLeader: 21 while (true) { 22 for (Node n : nodeList) { 23 try { 24 Thread.sleep(10000); 25 } catch (InterruptedException e) { 26 e.printStackTrace(); 27 } 28 if (n.ROLE == n.LEADER) { 29 leader = n; 30 break searchFirstLeader; 31 } 32 } 33 } 34 35 try { 36 Thread.sleep(10000); 37 leader.ROLE = leader.DEAD; //模拟leader挂了 38 39 } catch (InterruptedException e) { 40 e.printStackTrace(); 41 } 42 } 43 ).start(); 44 } 45 } 46 47 class Node { 48 String name; 49 int NODE = 0xFFFF; //node普通节点 50 int LEADING = 0x0000; //要求选举 51 int LEADER = 0x0001; //leader竞选成功 52 int DEAD = 0xEFFFF; //节点挂了 53 int ROLE = NODE; 54 int tickets = 0; //所得票数 55 boolean isTicket = false; 56 57 long lastHeartTime = -1; 58 int loseHeartCount = 0; 59 60 static List<Node> nodeList; 61 62 public Node(){ 63 new Thread( 64 () -> { 65 while (true) { 66 // System.out.println(this.name+" thread-1..."+this.loseHeartCount); 67 try { 68 Thread.sleep(3000); 69 } catch (InterruptedException e) { 70 e.printStackTrace(); 71 } 72 if (DEAD == ROLE) { 73 System.out.println(this.name + "已销毁,线程结束。"); 74 synchronized (nodeList) { 75 nodeList.remove(this); 76 } 77 break; 78 } 79 if (LEADER == ROLE) { 80 loseHeartCount = 0; 81 nodeList.forEach(item -> item.heart(this)); 82 continue; 83 } 84 if (loseHeartCount >= 3 && LEADING != ROLE) { 85 ROLE = LEADING; 86 System.out.println(this.name+" thread-1...同意选举"); 87 } 88 if (loseHeartCount < 3 && NODE == ROLE && System.currentTimeMillis()-lastHeartTime>10*1000) { 89 loseHeartCount++; 90 } 91 } 92 } 93 ).start(); 94 95 new Thread( 96 () -> { 97 while (true) { 98 if (DEAD == ROLE) { 99 break; 100 } 101 // System.out.println(this.name+" thread-2..."); 102 try { 103 Thread.sleep(new Random().nextInt(1333)); 104 } catch (InterruptedException e) { 105 e.printStackTrace(); 106 } 107 108 boolean isAllAgreeLeading = true; 109 if (LEADING == ROLE) { 110 for (Node n : nodeList) { 111 if (n.LEADING != n.ROLE) { 112 isAllAgreeLeading = false; 113 break; 114 } 115 } 116 if (!isAllAgreeLeading) { 117 continue; 118 } 119 } 120 121 if (LEADING == ROLE && !isTicket && nodeList.indexOf(this)==System.currentTimeMillis()%nodeList.size()) { 122 Node n = nodeList.get(0); 123 for (int i = 0; i < nodeList.size(); i++) { 124 if (n.tickets < nodeList.get(i).tickets) 125 n = nodeList.get(i); 126 } 127 128 int i = nodeList.indexOf(n); 129 if (n.tickets >= nodeList.size()/2) { 130 131 }else if (n.tickets >= nodeList.size()/3) { 132 i = new Random().nextBoolean() ? i : new Random().nextInt(nodeList.size()); 133 } else { 134 boolean s = new Random().nextBoolean(); //增加因子 135 do { 136 i = new Random().nextInt(nodeList.size()); 137 } while ((i%2==0)==s); 138 } 139 System.out.println(this.name+"已选举!"+nodeList.get(i).name); 140 nodeList.get(i).tickets++; 141 this.isTicket = true; 142 } 143 144 boolean isAllLeading = true; 145 for (Node n : nodeList) { 146 if (!n.isTicket) { 147 isAllLeading = false; 148 break; 149 } 150 } 151 if (!isAllLeading) { 152 continue; 153 } 154 155 synchronized (nodeList) { 156 System.out.println("正在统计中..........."); 157 158 System.out.println(this.name+" thread-2...synchronized"); 159 boolean isTicketFinished = true; 160 for (Node n : nodeList) { 161 if (!n.isTicket) { 162 isTicketFinished = false; 163 break; 164 } 165 } 166 if (isTicketFinished) { 167 int maxTickets = -1; 168 for (Node n : nodeList) { 169 if (n.tickets > maxTickets) { 170 maxTickets = n.tickets; 171 } 172 } 173 if (maxTickets < nodeList.size() / 2 + 1) { //不超过半数作废 174 System.out.println(this.name+":最高票数["+maxTickets+"]不超过半数,选举作废,重新选举..."); 175 for (Node n : nodeList) { 176 n.isTicket = false; 177 n.tickets = 0; 178 } 179 } else { 180 for (Node n : nodeList) { 181 if (n.tickets == maxTickets) { 182 n.ROLE = LEADER; 183 System.out.println(n.name+"竞选成功Leader."); 184 } else { 185 n.ROLE = NODE; 186 } 187 n.isTicket = false; 188 n.tickets = 0; 189 n.loseHeartCount = 0; 190 } 191 } 192 } 193 } 194 } 195 } 196 ).start(); 197 198 } 199 200 void heart(Node n){ 201 lastHeartTime = System.currentTimeMillis(); 202 if (this != n) 203 System.out.println(n.name+"发送一条心跳给"+this.name); 204 } 205 }
Demo源代码
节点4 thread-1...同意选举 节点3 thread-1...同意选举 节点6 thread-1...同意选举 节点2 thread-1...同意选举 节点5 thread-1...同意选举 节点8 thread-1...同意选举 节点7 thread-1...同意选举 节点9 thread-1...同意选举 节点1 thread-1...同意选举 节点0 thread-1...同意选举 节点6已选举!节点9 节点7已选举!节点7 节点3已选举!节点4 节点0已选举!节点6 节点2已选举!节点5 节点5已选举!节点8 节点9已选举!节点2 节点1已选举!节点4 节点8已选举!节点1 节点4已选举!节点1 正在统计中........... 节点4 thread-2...synchronized 节点4:最高票数[2]不超过半数,选举作废,重新选举... 节点7已选举!节点9 节点9已选举!节点7 节点6已选举!节点0 节点1已选举!节点6 节点5已选举!节点1 节点0已选举!节点1 节点2已选举!节点9 节点4已选举!节点7 节点8已选举!节点8 节点3已选举!节点0 正在统计中........... 节点3 thread-2...synchronized 节点3:最高票数[2]不超过半数,选举作废,重新选举... 节点7已选举!节点5 节点4已选举!节点1 节点0已选举!节点5 节点3已选举!节点6 节点8已选举!节点1 节点9已选举!节点8 节点1已选举!节点0 节点2已选举!节点4 节点6已选举!节点0 节点5已选举!节点6 正在统计中........... 节点5 thread-2...synchronized 节点5:最高票数[2]不超过半数,选举作废,重新选举... 节点1已选举!节点3 节点9已选举!节点2 节点0已选举!节点6 节点8已选举!节点7 节点4已选举!节点9 节点7已选举!节点9 节点3已选举!节点8 节点5已选举!节点9 节点6已选举!节点4 节点2已选举!节点9 正在统计中........... 节点2 thread-2...synchronized 节点2:最高票数[4]不超过半数,选举作废,重新选举... 节点0已选举!节点5 节点3已选举!节点3 节点8已选举!节点8 节点1已选举!节点3 节点7已选举!节点8 节点9已选举!节点7 节点4已选举!节点0 节点5已选举!节点4 节点2已选举!节点5 节点6已选举!节点3 正在统计中........... 节点6 thread-2...synchronized 节点6:最高票数[3]不超过半数,选举作废,重新选举... 节点1已选举!节点3 节点8已选举!节点8 节点5已选举!节点0 节点0已选举!节点6 节点9已选举!节点2 节点2已选举!节点0 节点3已选举!节点7 节点6已选举!节点2 节点4已选举!节点7 节点7已选举!节点0 正在统计中........... 节点7 thread-2...synchronized 节点7:最高票数[3]不超过半数,选举作废,重新选举... 节点3已选举!节点9 节点0已选举!节点0 节点5已选举!节点6 节点8已选举!节点2 节点7已选举!节点3 节点4已选举!节点4 节点6已选举!节点1 节点2已选举!节点6 节点1已选举!节点6 节点9已选举!节点6 正在统计中........... 节点9 thread-2...synchronized 节点9:最高票数[4]不超过半数,选举作废,重新选举... 节点1已选举!节点7 节点3已选举!节点8 节点5已选举!节点3 节点2已选举!节点2 节点6已选举!节点4 节点7已选举!节点8 节点0已选举!节点9 节点8已选举!节点2 节点9已选举!节点3 节点4已选举!节点9 正在统计中........... 节点4 thread-2...synchronized 节点4:最高票数[2]不超过半数,选举作废,重新选举... 节点4已选举!节点8 节点6已选举!节点8 节点8已选举!节点4 节点9已选举!节点3 节点1已选举!节点6 节点2已选举!节点2 节点7已选举!节点3 节点5已选举!节点2 节点0已选举!节点4 节点3已选举!节点0 正在统计中........... 节点3 thread-2...synchronized 节点3:最高票数[2]不超过半数,选举作废,重新选举... 节点9已选举!节点8 节点3已选举!节点1 节点7已选举!节点4 节点2已选举!节点5 节点8已选举!节点5 节点4已选举!节点3 节点1已选举!节点5 节点0已选举!节点5 节点5已选举!节点4 节点6已选举!节点4 正在统计中........... 节点6 thread-2...synchronized 节点6:最高票数[4]不超过半数,选举作废,重新选举... 节点6已选举!节点4 节点4已选举!节点4 节点9已选举!节点4 节点0已选举!节点0 节点2已选举!节点5 节点8已选举!节点4 节点1已选举!节点4 节点7已选举!节点4 节点3已选举!节点4 节点5已选举!节点4 正在统计中........... 节点5 thread-2...synchronized 节点4竞选成功Leader. 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4发送一条心跳给节点0 节点4发送一条心跳给节点1 节点4发送一条心跳给节点2 节点4发送一条心跳给节点3 节点4发送一条心跳给节点5 节点4发送一条心跳给节点6 节点4发送一条心跳给节点7 节点4发送一条心跳给节点8 节点4发送一条心跳给节点9 节点4已销毁,线程结束。 节点6 thread-1...同意选举 节点8 thread-1...同意选举 节点3 thread-1...同意选举 节点0 thread-1...同意选举 节点2 thread-1...同意选举 节点7 thread-1...同意选举 节点9 thread-1...同意选举 节点5 thread-1...同意选举 节点1 thread-1...同意选举 节点6已选举!节点7 节点1已选举!节点7 节点9已选举!节点0 节点3已选举!节点1 节点2已选举!节点7 节点8已选举!节点7 节点0已选举!节点7 节点7已选举!节点7 节点5已选举!节点7 正在统计中........... 节点5 thread-2...synchronized 节点7竞选成功Leader. 节点7发送一条心跳给节点0 节点7发送一条心跳给节点1 节点7发送一条心跳给节点2 节点7发送一条心跳给节点3 节点7发送一条心跳给节点5 节点7发送一条心跳给节点6 节点7发送一条心跳给节点8 节点7发送一条心跳给节点9 节点7发送一条心跳给节点0 节点7发送一条心跳给节点1 节点7发送一条心跳给节点2 节点7发送一条心跳给节点3 节点7发送一条心跳给节点5 节点7发送一条心跳给节点6 节点7发送一条心跳给节点8 节点7发送一条心跳给节点9 节点7发送一条心跳给节点0 节点7发送一条心跳给节点1 节点7发送一条心跳给节点2 节点7发送一条心跳给节点3 节点7发送一条心跳给节点5 节点7发送一条心跳给节点6 节点7发送一条心跳给节点8 节点7发送一条心跳给节点9 节点7发送一条心跳给节点0 节点7发送一条心跳给节点1 节点7发送一条心跳给节点2 节点7发送一条心跳给节点3 节点7发送一条心跳给节点5 节点7发送一条心跳给节点6 节点7发送一条心跳给节点8 节点7发送一条心跳给节点9 节点7发送一条心跳给节点0 节点7发送一条心跳给节点1 节点7发送一条心跳给节点2 节点7发送一条心跳给节点3 节点7发送一条心跳给节点5 节点7发送一条心跳给节点6 节点7发送一条心跳给节点8 节点7发送一条心跳给节点9 节点7发送一条心跳给节点0 节点7发送一条心跳给节点1 节点7发送一条心跳给节点2 节点7发送一条心跳给节点3 节点7发送一条心跳给节点5 节点7发送一条心跳给节点6 节点7发送一条心跳给节点8 节点7发送一条心跳给节点9 节点7发送一条心跳给节点0 节点7发送一条心跳给节点1 节点7发送一条心跳给节点2 节点7发送一条心跳给节点3 节点7发送一条心跳给节点5 节点7发送一条心跳给节点6 节点7发送一条心跳给节点8 节点7发送一条心跳给节点9 节点7发送一条心跳给节点0 节点7发送一条心跳给节点1 节点7发送一条心跳给节点2 节点7发送一条心跳给节点3 节点7发送一条心跳给节点5 节点7发送一条心跳给节点6 节点7发送一条心跳给节点8 节点7发送一条心跳给节点9 节点7发送一条心跳给节点0 节点7发送一条心跳给节点1 节点7发送一条心跳给节点2 节点7发送一条心跳给节点3 节点7发送一条心跳给节点5 节点7发送一条心跳给节点6 节点7发送一条心跳给节点8 节点7发送一条心跳给节点9 节点7发送一条心跳给节点0 节点7发送一条心跳给节点1 节点7发送一条心跳给节点2 节点7发送一条心跳给节点3 节点7发送一条心跳给节点5 节点7发送一条心跳给节点6 节点7发送一条心跳给节点8 节点7发送一条心跳给节点9 节点7发送一条心跳给节点0 节点7发送一条心跳给节点1 节点7发送一条心跳给节点2 节点7发送一条心跳给节点3 节点7发送一条心跳给节点5 节点7发送一条心跳给节点6 节点7发送一条心跳给节点8 节点7发送一条心跳给节点9 节点7发送一条心跳给节点0 节点7发送一条心跳给节点1 节点7发送一条心跳给节点2 节点7发送一条心跳给节点3 节点7发送一条心跳给节点5 节点7发送一条心跳给节点6 节点7发送一条心跳给节点8 节点7发送一条心跳给节点9 节点7发送一条心跳给节点0 节点7发送一条心跳给节点1 节点7发送一条心跳给节点2 节点7发送一条心跳给节点3 节点7发送一条心跳给节点5 节点7发送一条心跳给节点6 节点7发送一条心跳给节点8 节点7发送一条心跳给节点9 节点7发送一条心跳给节点0 节点7发送一条心跳给节点1 节点7发送一条心跳给节点2 节点7发送一条心跳给节点3 节点7发送一条心跳给节点5 节点7发送一条心跳给节点6 节点7发送一条心跳给节点8 节点7发送一条心跳给节点9 ……
感兴趣的朋友可以参考。
原文:https://www.cnblogs.com/cheng2839/p/14915552.html