update at 2019-07-19 14:14:12 by ehlxr
This commit is contained in:
		| @@ -1,64 +0,0 @@ | ||||
| package me.ehlxr; | ||||
|  | ||||
| import com.google.common.collect.Lists; | ||||
|  | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| import java.util.concurrent.atomic.AtomicInteger; | ||||
|  | ||||
| /** | ||||
|  * 按比例控制流量 | ||||
|  * | ||||
|  * @author lixiangrong | ||||
|  * @since 2019-07-18. | ||||
|  */ | ||||
| public class BarrierTest { | ||||
|     public static void main(String[] args) { | ||||
|         Barrier barrier = new Barrier(10, 3); | ||||
|  | ||||
|         final Thread[] threads = new Thread[20]; | ||||
|         for (int i = 0; i < threads.length; i++) { | ||||
|             threads[i] = new Thread(() -> { | ||||
|                 if (barrier.allow()) { | ||||
|                     System.out.println("yes"); | ||||
|                 } | ||||
|             }); | ||||
|             threads[i].start(); | ||||
|         } | ||||
|  | ||||
|         for (Thread t : threads) { | ||||
|             try { | ||||
|                 t.join(); | ||||
|             } catch (InterruptedException e) { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
|  | ||||
| class Barrier { | ||||
|     private AtomicInteger op = new AtomicInteger(0); | ||||
|     private List<Integer> sources = Lists.newArrayList(); | ||||
|     private int base; | ||||
|     private int rate; | ||||
|  | ||||
|     public boolean allow() { | ||||
|         return sources.get(op.incrementAndGet() % base) < rate; | ||||
|     } | ||||
|  | ||||
|     private Barrier() { | ||||
|     } | ||||
|  | ||||
|     public Barrier(int base, int rate) { | ||||
|         this.base = base; | ||||
|         this.rate = rate; | ||||
|  | ||||
|         for (int i = 0; i < 10; i++) { | ||||
|             sources.add(i); | ||||
|         } | ||||
|         Collections.shuffle(sources); | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
							
								
								
									
										57
									
								
								src/main/java/me/ehlxr/rate/Main.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								src/main/java/me/ehlxr/rate/Main.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| package me.ehlxr.rate; | ||||
|  | ||||
| /** | ||||
|  * @author lixiangrong | ||||
|  * @since 2019-07-18. | ||||
|  */ | ||||
| public class Main { | ||||
|     public static void main(String[] args) { | ||||
|         RateBarrier rateBarrier = new RateBarrier(10, 3); | ||||
|  | ||||
|         final Thread[] threads = new Thread[20]; | ||||
|         for (int i = 0; i < threads.length; i++) { | ||||
|             threads[i] = new Thread(() -> { | ||||
|                 if (rateBarrier.allow()) { | ||||
|                     System.out.println("this is on 3"); | ||||
|                 } else { | ||||
|                     System.out.println("this is on 7"); | ||||
|                 } | ||||
|             }); | ||||
|             threads[i].start(); | ||||
|         } | ||||
|  | ||||
|         for (Thread t : threads) { | ||||
|             try { | ||||
|                 t.join(); | ||||
|             } catch (InterruptedException e) { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Output: | ||||
|  | ||||
| /* | ||||
| this is on 7 | ||||
| this is on 7 | ||||
| this is on 7 | ||||
| this is on 7 | ||||
| this is on 3 | ||||
| this is on 7 | ||||
| this is on 3 | ||||
| this is on 7 | ||||
| this is on 7 | ||||
| this is on 3 | ||||
| this is on 7 | ||||
| this is on 7 | ||||
| this is on 7 | ||||
| this is on 7 | ||||
| this is on 3 | ||||
| this is on 7 | ||||
| this is on 3 | ||||
| this is on 7 | ||||
| this is on 7 | ||||
| this is on 3 | ||||
| */ | ||||
							
								
								
									
										40
									
								
								src/main/java/me/ehlxr/rate/RateBarrier.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/main/java/me/ehlxr/rate/RateBarrier.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| package me.ehlxr.rate; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| import java.util.concurrent.atomic.AtomicInteger; | ||||
|  | ||||
| /** | ||||
|  * 按比例控制流量 | ||||
|  * | ||||
|  * @author lixiangrong | ||||
|  * @since 2019-07-19. | ||||
|  */ | ||||
| public class RateBarrier { | ||||
|     private AtomicInteger op = new AtomicInteger(0); | ||||
|     private List<Integer> source; | ||||
|     private int base; | ||||
|     private int rate; | ||||
|  | ||||
|     public boolean allow() { | ||||
|         return source.get(op.incrementAndGet() % base) < rate; | ||||
|     } | ||||
|  | ||||
|     private RateBarrier() { | ||||
|     } | ||||
|  | ||||
|     public RateBarrier(int base, int rate) { | ||||
|         this.base = base; | ||||
|         this.rate = rate; | ||||
|  | ||||
|         source = new ArrayList<>(base); | ||||
|         for (int i = 0; i < base; i++) { | ||||
|             source.add(i); | ||||
|         } | ||||
|  | ||||
|         // 打乱集合顺序 | ||||
|         Collections.shuffle(source); | ||||
|     } | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user