1 package org.kuali.common.jute.runtime;
2
3 import static org.kuali.common.jute.base.Precondition.checkMin;
4
5 import java.lang.management.ManagementFactory;
6 import java.lang.management.ThreadMXBean;
7
8 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
9
10 @JsonDeserialize(builder = Threads.Builder.class)
11 public final class Threads {
12
13 private final int current;
14 private final int daemon;
15 private final int peak;
16
17 private Threads(Builder builder) {
18 this.current = builder.current;
19 this.daemon = builder.daemon;
20 this.peak = builder.peak;
21 }
22
23 public static Threads build() {
24 ThreadMXBean bean = ManagementFactory.getThreadMXBean();
25 Builder builder = builder();
26 builder.withCurrent(bean.getThreadCount());
27 builder.withDaemon(bean.getDaemonThreadCount());
28 builder.withPeak(bean.getPeakThreadCount());
29 return builder.build();
30 }
31
32 public static Builder builder() {
33 return new Builder();
34 }
35
36 public static class Builder implements org.apache.commons.lang3.builder.Builder<Threads> {
37
38 private int current;
39 private int daemon;
40 private int peak;
41
42 public Builder withCurrent(int current) {
43 this.current = current;
44 return this;
45 }
46
47 public Builder withDaemon(int daemon) {
48 this.daemon = daemon;
49 return this;
50 }
51
52 public Builder withPeak(int peak) {
53 this.peak = peak;
54 return this;
55 }
56
57 @Override
58 public Threads build() {
59 return validate(new Threads(this));
60 }
61
62 private static Threads validate(Threads instance) {
63 checkMin(instance.current, 0, "current");
64 checkMin(instance.daemon, 0, "daemon");
65 checkMin(instance.peak, 0, "peak");
66 return instance;
67 }
68 }
69
70 public int getCurrent() {
71 return current;
72 }
73
74 public int getDaemon() {
75 return daemon;
76 }
77
78 public int getPeak() {
79 return peak;
80 }
81
82 }