1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.hipparchus.analysis.integration.gauss;
23
24 import org.hipparchus.util.Binary64;
25 import org.hipparchus.util.Binary64Field;
26 import org.hipparchus.util.Pair;
27 import org.junit.jupiter.api.Test;
28
29 import java.util.ArrayList;
30 import java.util.List;
31 import java.util.concurrent.ArrayBlockingQueue;
32 import java.util.concurrent.Callable;
33 import java.util.concurrent.ExecutionException;
34 import java.util.concurrent.Future;
35 import java.util.concurrent.ThreadPoolExecutor;
36 import java.util.concurrent.TimeUnit;
37 import java.util.concurrent.atomic.AtomicInteger;
38
39 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
40 import static org.junit.jupiter.api.Assertions.assertEquals;
41
42
43
44
45
46 class FieldRuleFactoryTest {
47
48
49
50
51 @Test
52 void testConcurrentCreation() throws InterruptedException,
53 ExecutionException {
54
55 final int numTasks = 20;
56
57 final ThreadPoolExecutor exec
58 = new ThreadPoolExecutor(3, numTasks, 1, TimeUnit.SECONDS,
59 new ArrayBlockingQueue<Runnable>(2));
60
61 final List<Future<Pair<Binary64[], Binary64[]>>> results
62 = new ArrayList<Future<Pair<Binary64[], Binary64[]>>>();
63 for (int i = 0; i < numTasks; i++) {
64 results.add(exec.submit(new RuleBuilder()));
65 }
66
67
68 for (Future<Pair<Binary64[], Binary64[]>> f : results) {
69 f.get();
70 }
71
72
73 final int n = RuleBuilder.getNumberOfCalls();
74 assertEquals(1, n, "Rule computation was called " + n + " times");
75 }
76
77 private static class RuleBuilder implements Callable<Pair<Binary64[], Binary64[]>> {
78 private static final DummyRuleFactory factory = new DummyRuleFactory();
79
80 public Pair<Binary64[], Binary64[]> call() {
81 final int dummy = 2;
82 return factory.getRule(dummy);
83 }
84
85 public static int getNumberOfCalls() {
86 return factory.getNumberOfCalls();
87 }
88 }
89
90 private static class DummyRuleFactory extends FieldAbstractRuleFactory<Binary64> {
91
92 private static AtomicInteger nCalls = new AtomicInteger();
93
94
95 DummyRuleFactory() {
96 super(Binary64Field.getInstance());
97 }
98
99 @Override
100 protected Pair<Binary64[], Binary64[]> computeRule(int order) {
101
102 nCalls.getAndIncrement();
103
104 assertDoesNotThrow(() -> {
105
106 Thread.sleep(20);
107 }, "Unexpected interruption");
108
109
110 final Binary64[] p = new Binary64[order];
111 final Binary64[] w = new Binary64[order];
112 for (int i = 0; i < order; i++) {
113 p[i] = new Binary64(i);
114 w[i] = new Binary64(i);
115 }
116 return new Pair<>(p, w);
117 }
118
119 public int getNumberOfCalls() {
120 return nCalls.get();
121 }
122
123 }
124
125 }