139 }
140
141 /**
142 * doubleValue returns current value.
143 */
144 public void testDoubleValue() {
145 DoubleAccumulator acc = new DoubleAccumulator(Double::max, 0.0);
146 assertEquals(0.0, acc.doubleValue());
147 acc.accumulate(1.0);
148 assertEquals(1.0, acc.doubleValue());
149 }
150
151 /**
152 * accumulates by multiple threads produce correct result
153 */
154 public void testAccumulateAndGetMT() {
155 final DoubleAccumulator acc
156 = new DoubleAccumulator((x, y) -> x + y, 0.0);
157 final int nThreads = ThreadLocalRandom.current().nextInt(1, 5);
158 final Phaser phaser = new Phaser(nThreads + 1);
159 final int incs = 1_000_000;
160 final double total = nThreads * incs/2.0 * (incs - 1); // Gauss
161 final Runnable task = () -> {
162 phaser.arriveAndAwaitAdvance();
163 for (int i = 0; i < incs; i++) {
164 acc.accumulate((double) i);
165 assertTrue(acc.get() <= total);
166 }
167 phaser.arrive();
168 };
169 final ExecutorService p = Executors.newCachedThreadPool();
170 try (PoolCleaner cleaner = cleaner(p)) {
171 for (int i = nThreads; i-->0; )
172 p.execute(task);
173 phaser.arriveAndAwaitAdvance();
174 phaser.arriveAndAwaitAdvance();
175 assertEquals(total, acc.get());
176 }
177 }
178
179 }
|
139 }
140
141 /**
142 * doubleValue returns current value.
143 */
144 public void testDoubleValue() {
145 DoubleAccumulator acc = new DoubleAccumulator(Double::max, 0.0);
146 assertEquals(0.0, acc.doubleValue());
147 acc.accumulate(1.0);
148 assertEquals(1.0, acc.doubleValue());
149 }
150
151 /**
152 * accumulates by multiple threads produce correct result
153 */
154 public void testAccumulateAndGetMT() {
155 final DoubleAccumulator acc
156 = new DoubleAccumulator((x, y) -> x + y, 0.0);
157 final int nThreads = ThreadLocalRandom.current().nextInt(1, 5);
158 final Phaser phaser = new Phaser(nThreads + 1);
159 final int incs = expensiveTests ? 1_000_000 : 100_000;
160 final double total = nThreads * incs/2.0 * (incs - 1); // Gauss
161 final Runnable task = () -> {
162 phaser.arriveAndAwaitAdvance();
163 for (int i = 0; i < incs; i++) {
164 acc.accumulate((double) i);
165 assertTrue(acc.get() <= total);
166 }
167 phaser.arrive();
168 };
169 final ExecutorService p = Executors.newCachedThreadPool();
170 try (PoolCleaner cleaner = cleaner(p)) {
171 for (int i = nThreads; i-->0; )
172 p.execute(task);
173 phaser.arriveAndAwaitAdvance();
174 phaser.arriveAndAwaitAdvance();
175 assertEquals(total, acc.get());
176 }
177 }
178
179 }
|