简介
sybn counter 是一个多线程计数器, 此接口的两个实现 SybnCounterImpl 和 SybnCounterMapImpl 都是线程安全的. sybn counter 主要有以下功能:
- 以 Map<String, Long> 的形式维护一组支持inc操作的long型数据
- 记录任务的开始时间和任务进度,预估任务的剩余时间
用法举例
import cn.sybn.bean.counter.SybnCounter;
import cn.sybn.bean.counter.SybnCounterImpl;
SybnCounter count = new SybnCounterImpl();
count.setCount("aaa", 1);
count.incCount("aaa", 1);
long aaa = count.getCount("aaa"); // 2
count.setTotal(100);
count.incCurrent(10);
String log = count.toCountString(); // {progress:10/100( 10.00%), currentTime:1ms, remainTime:9ms, aaa:2}
- SybnCounterImpl 和 SybnCounterMapImpl 线程安全 SybnCounterSimpleImpl 线程不安全
@Test public void mainTest() { // 测试并发 300 个线程同时写入 final SybnCounterImpl c = new SybnCounterImpl(); ExecutorService service = Executors.newFixedThreadPool(300); for (int i = 0; i < 1000; i++) { service.execute(new SybnCounterUtil.SybnCounterTestThread(c, i)); } service.shutdown(); try { service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); LogUtil.info(c); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } catch (Exception e) { LogUtil.getLogger().error("", e); } SybnCounterImpl c2 = new SybnCounterImpl(false); c2.setCount("a", 1); c2.incCount("a", 1); c2.clearCount("a"); c2.incCount("a", 1); Assert.assertEquals(1, c2.getCount("a")); }
- SybnCounterMapAutoClearImpl 自动淘汰低频数据