1 /** 2 * Copyright (c) 2012, University of Konstanz, Distributed Systems Group 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * * Neither the name of the University of Konstanz nor the 13 * names of its contributors may be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY 20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 package org.perfidix.meter; 28 29 /** 30 * This class measures the number of threads in the runtime. 31 * 32 * @author Sebastian Graf, University of Konstanz 33 */ 34 public final class ThreadMeter extends AbstractMeter { 35 36 /** 37 * the threadgroup to analyse. 38 */ 39 private transient final ThreadGroup topThreadGroup; 40 41 /** Name of the Meter. */ 42 private static final String NAME = "ThreadMeter"; 43 44 /** Unit of the Meter. */ 45 private static final String UNIT = "threads"; 46 47 /** UnitDescription of the Meter. */ 48 private static final String DESCRIPTION = "Number of Threads"; 49 50 /** 51 * Constructor; 52 */ 53 public ThreadMeter() { 54 super(); 55 final Thread ownThread = Thread.currentThread(); 56 final ThreadGroup ownGroup = ownThread.getThreadGroup(); 57 ThreadGroup group = null; 58 do { 59 group = ownGroup.getParent(); 60 } while (group.getParent() != null); 61 this.topThreadGroup = group; 62 } 63 64 /** 65 * Constructor. 66 * 67 * @param group 68 * the group of number of threads to analyse. 69 */ 70 public ThreadMeter(final ThreadGroup group) { 71 super(); 72 this.topThreadGroup = group; 73 } 74 75 /** {@inheritDoc} */ 76 @Override 77 public String getName() { 78 return NAME; 79 } 80 81 /** {@inheritDoc} */ 82 @Override 83 public String getUnit() { 84 return UNIT; 85 } 86 87 /** {@inheritDoc} */ 88 @Override 89 public String getUnitDescription() { 90 return DESCRIPTION; 91 } 92 93 /** {@inheritDoc} */ 94 @Override 95 public double getValue() { 96 return topThreadGroup.activeCount(); 97 } 98 99 /** {@inheritDoc} */ 100 @Override 101 public int hashCode() { 102 final int prime = 31; 103 int result = prime; 104 result = prime * result; 105 106 return result; 107 } 108 109 /** {@inheritDoc} */ 110 @Override 111 public boolean equals(final Object obj) { 112 boolean returnVal = true; 113 if (this == obj) { 114 returnVal = true; 115 } 116 if (getClass() == obj.getClass()) { 117 returnVal = true; 118 } else { 119 returnVal = false; 120 } 121 return returnVal; 122 } 123 124 }