package net.dubboclub.circuitbreaker; import java.util.Iterator; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; class BreakCounterLoop extends Thread { private long intervalTime; private BlockingQueue<BreakCounter> queue = new LinkedBlockingQueue<BreakCounter>(); private volatile boolean started =false; private Object startLock = new Object(); BreakCounterLoop(long intervalTime){ this.setDaemon(true); this.intervalTime=intervalTime; } public void register(BreakCounter counter){ queue.offer(counter); synchronized (startLock){ if(!started){ start(); started=true; } } } @Override public void run() { for(;;){ Iterator<BreakCounter> iterator = queue.iterator(); while(iterator.hasNext()){ BreakCounter counter = iterator.next(); if(counter.isEnable()) { counter.run(); }else{ iterator.remove(); } } try { Thread.sleep(intervalTime); } catch (InterruptedException e) { } } } }