4
4
import java .util .Collections ;
5
5
import java .util .Comparator ;
6
6
import java .util .List ;
7
+ import java .util .Timer ;
8
+ import java .util .TimerTask ;
9
+ import java .util .concurrent .CountDownLatch ;
7
10
import java .util .stream .Collectors ;
8
11
9
12
public class PeriodCalculator {
@@ -20,9 +23,18 @@ public long getPeriodNs() throws InterruptedException {
20
23
// Start recording timestamps
21
24
registeredTimestamps = new ArrayList <>();
22
25
shouldRegister = true ;
23
- Thread .sleep (CALC_DURATION_MS );
24
- // Stop recording timestamps and calculate period
25
- shouldRegister = false ;
26
+ final CountDownLatch latch = new CountDownLatch (1 );
27
+ TimerTask task = new TimerTask () {
28
+ public void run () {
29
+ // Stop recording timestamps and calculate period
30
+ shouldRegister = false ;
31
+ latch .countDown ();
32
+ }
33
+ };
34
+ Timer timer = new Timer ("Timer" );
35
+
36
+ timer .schedule (task , CALC_DURATION_MS );
37
+ latch .await ();
26
38
return calcPeriodNsClusters (getDiff (registeredTimestamps ));
27
39
}
28
40
@@ -61,14 +73,10 @@ private long calcPeriodNsMedian(ArrayList<Long> numArray) {
61
73
}
62
74
63
75
private long median (ArrayList <Long > numArray ) {
64
- numArray .sort (Comparator .naturalOrder ());
65
- double median ;
66
- if (numArray .size () % 2 == 0 )
67
- median = ((double )numArray .get (numArray .size ()/2 )
68
- + (double )numArray .get (numArray .size ()/2 - 1 ))/2 ;
69
- else
70
- median = (double ) numArray .get (numArray .size ()/2 );
71
- return (long )median ;
76
+ Collections .sort (numArray );
77
+ int middle = numArray .size () / 2 ;
78
+ middle = middle > 0 && middle % 2 == 0 ? middle - 1 : middle ;
79
+ return numArray .get (middle );
72
80
}
73
81
74
82
public void onFrameTimestamp (long timestampNs ) {
@@ -77,6 +85,4 @@ public void onFrameTimestamp(long timestampNs) {
77
85
registeredTimestamps .add (timestampNs );
78
86
}
79
87
}
80
-
81
-
82
88
}
0 commit comments