`
ilovejavaforever
  • 浏览: 163871 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

多线程监控统计计数器

阅读更多

    上个月写了一个统计的计数器。下边是一个在多线程并发访问下,计数的类。用于监控报警,先贴代码,有空了再解读给大家

import java.util.concurrent.atomic.AtomicReference;

public class RequestCounter {
	private final AtomicReference<Accumulator> values;
	private final int durationMS;
	
	public RequestCounter(int durationMS) {
		this.values = new AtomicReference<Accumulator>(new Accumulator());
		this.durationMS = durationMS;
	}

	public long getCount() {
		return getValidAccumulator().count;
	}

	public long getTotalCount() {
		return getValidAccumulator().total;
	}

	public double getAverageTimeInMs() {
		return getValidAccumulator().getAverageTimeMS();
	}

	public float getThroughput() {
		Accumulator oldv = getValidAccumulator();
		double elapsed = (System.currentTimeMillis() - oldv.startTimeMS) / 1000;
		if (elapsed > 0f) {
			return (float) (oldv.count / elapsed);
		} else {
			return -1f;
		}
	}

	private Accumulator getValidAccumulator() {

		Accumulator accum = values.get();
		long now = System.currentTimeMillis();

		if (now - accum.startTimeMS <= durationMS) {
			return accum;
		}

		Accumulator newWithTotal = accum.newWithTotal();

		if (values.compareAndSet(accum, newWithTotal)) {
			return newWithTotal;
		}

		return values.get();
	}

	public void addRequest(long timeNS) {

		for (int i = 0; i < 3; i++) {
			Accumulator oldv = getValidAccumulator();

			long startTimeMS = oldv.startTimeMS;
			long count = oldv.count + 1;
			long totalTimeNS = oldv.totalTimeMS + timeNS;
			long total = oldv.total + 1;

			if (values.compareAndSet(oldv, new Accumulator(startTimeMS, count,
					totalTimeNS, total))) {
				return;
			}
		}
	}

	private static class Accumulator {

		final long startTimeMS;
		final long count;
		final long totalTimeMS;
		final long total;

		public Accumulator() {
			this(System.currentTimeMillis(), 0, 0, 0);
		}

		public Accumulator newWithTotal() {
			return new Accumulator(System.currentTimeMillis(), 0, 0, total);
		}

		public Accumulator(long startTimeMS, long count, long totalTimeMS,
				long total) {
			this.startTimeMS = startTimeMS;
			this.count = count;
			this.totalTimeMS = totalTimeMS;
			this.total = total;
		}

		public double getAverageTimeMS() {
			return count > 0 ? 1f * totalTimeMS / count : -0f;
		}
	}
}

 

分享到:
评论

相关推荐

    安全稳定的实现进线程监控.rar_win2000源代码_监控

    在提供的压缩包文件中,"安全稳定的实现进线程监控.txt"可能是详细讲解线程监控实现的文档,而"www.pudn.com.txt"可能是一个指向更多资源的链接,例如在PUDN论坛上讨论的详细教程或源代码。 总的来说,安全稳定的...

    c#写的计数器

    更复杂的应用可能涉及到多线程或异步操作,比如在网络请求中统计成功或失败的次数。在这种情况下,为了确保线程安全,可能需要使用`Interlocked`类或`lock`关键字来同步对计数器的访问。 此外,C#中的`System....

    简单的性能计数器

    在多线程环境中,还可以用来评估不同任务之间的同步和竞争情况。 2. **CPU时钟周期**:CPU时钟周期是处理器完成一次基本操作的时间。通过统计CPU时钟周期,我们可以了解代码对处理器的使用效率。较低的时钟周期数...

    多线程精确20ms定时器RTP发包转发收包压力测试工具

    在IT行业中,多线程编程和实时传输协议(RTP)是两个重要的概念,尤其是在网络通信和音频视频处理领域。本项目"多线程精确20ms定时器RTP发包转发收包压力测试工具"显然是针对这些技术的实践应用。下面我们将详细探讨...

    java计数器

    这个计数值通常以原子整型(AtomicInteger)的形式存在,因为它是线程安全的,可以避免多线程环境下同步问题导致的错误计数。以下是一个简单的Servlet计数器示例: ```java import javax.servlet.http.HttpServlet;...

    毒爱计数器

    在实际开发中,计数器类可能还需要考虑线程安全问题,特别是在多线程或多进程环境中。为了确保计数的准确性,可能需要引入锁或其他同步机制,以防止并发访问时出现数据不一致。例如,在Java中,可以使用`...

    乘风多用户计数器 mssql版 v4.7.zip

    它涵盖了数据库管理、多线程编程、用户交互等多个关键知识点,是实践数据库应用和Web开发技能的理想平台。通过分析和修改这款计数器的源码,学生可以加深对实际项目开发流程的理解,提升问题解决和代码调试的能力。 ...

    Websphere计数器说明.doc

    这些计数器涵盖了多个方面,包括JVM(Java虚拟机)、JDBC连接池和线程池的性能指标。了解并分析这些计数器的数据可以帮助管理员优化系统资源利用率,确保应用的稳定性和高效运行。 1. **JVM运行时计数器**: - **...

    Java程序监控API Java Simon

    - **线程安全**:所有的Simon操作都是线程安全的,这意味着在多线程环境中无需额外的同步措施。 - **轻量级**:Java Simon的体积小,对应用程序的性能影响极小,适合嵌入到各种项目中。 集成Java Simon到你的项目中...

    windows网络流量监控

    7. **处理多线程和异步操作**:为了不阻塞用户界面,可以使用多线程或异步IO。例如,使用`WSAAsyncSelect`或`WSAEventSelect`来注册事件通知,当有新的数据可读或可写时,系统会触发预先设定的事件。 8. **日志记录...

    Springboot网站用户的访问量统计

    3. **线程安全**:考虑到多线程环境,我们需要确保计数器的增加操作是线程安全的。可以使用`AtomicInteger`或`synchronized`关键字来保证并发访问时的正确性。 4. **持久化**:访问量数据通常需要持久化存储,以便...

    远程监控(C#源代码)

    3. **多线程处理**:在C#中,System.Threading命名空间提供了线程和同步工具,用于处理并发请求和异步操作。这在远程监控中非常重要,因为系统可能需要同时接收和处理多个监控数据流。 4. **日志记录**:为了跟踪和...

    JAVA Web在线用户统计

    这可能涉及到线程安全的计数器,如Java的`AtomicInteger`,确保在多线程环境下正确地增加和减少在线用户计数。 7. **负载均衡与集群**:在分布式环境中,需要考虑如何在多个服务器之间共享会话和统计信息。可以通过...

    一个针对高并发、低延迟应用设计的高性能 Java 性能监控和统计工具.zip

    5. **多维度统计**:除了基础的计数器和平均值,MyPerf4J还支持百分位数、标准差等统计维度,为性能分析提供了丰富的数据支持。 6. **日志记录与报告**:MyPerf4J可以将收集到的性能数据记录到日志文件,并定期生成...

    c#实现软件系统监控.rar

    这通常涉及到多线程、异步编程和设计模式的应用。 6. **第三方库**:有一些第三方库如NLog、Serilog等,提供了更高级的日志管理和分布式日志追踪功能,便于在复杂系统中进行监控。 7. **网络监控**:如果系统涉及...

    事件计数器

    1. 使用AtomicInteger:`AtomicInteger`是线程安全的,可以保证在多线程环境下的正确性。例如: ```java import java.util.concurrent.atomic.AtomicInteger; public class EventCounter { private AtomicInteger...

    WebSphere性能分析监控

    在该页面中勾选“启用性能监控基础结构(PMI)”,并在“当前监控的统计信息集”中选择“定制”方式。之后点击应用并进入“定制监控级别”。 3. **定制监控级别**: - 在此步骤中,需要根据实际需求启用一系列的监控...

    Windows下查看进程中的线程

    一个进程可以包含多个线程,它们共享同一地址空间,但拥有各自的执行路径。查看进程中的线程可以帮助我们理解程序运行时的情况,比如CPU使用率高的原因可能是某个线程在进行密集计算,或者线程间通信出现问题导致的...

    通过文件的读写完成网络流量的统计

    - 性能监控:如何监控计数器操作对系统性能的影响。 最后,压缩包中的“完整工程”包含了实现上述功能的源代码,包括JSP页面、Servlet或其他后端组件,以及可能的配置文件。通过学习和分析这些代码,你可以更深入地...

Global site tag (gtag.js) - Google Analytics