ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorCompletionService9Test.java
Revision: 1.5
Committed: Wed Aug 24 22:22:39 2016 UTC (7 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.4: +0 -1 lines
Log Message:
fix imports

File Contents

# Content
1 /*
2 * Written by Doug Lea and Martin Buchholz with assistance from
3 * members of JCP JSR-166 Expert Group and released to the public
4 * domain, as explained at
5 * http://creativecommons.org/publicdomain/zero/1.0/
6 */
7
8 import java.util.ArrayList;
9 import java.util.Collection;
10 import java.util.List;
11 import java.util.Set;
12 import java.util.HashSet;
13 import java.util.concurrent.Callable;
14 import java.util.concurrent.CompletionService;
15 import java.util.concurrent.ExecutionException;
16 import java.util.concurrent.Executor;
17 import java.util.concurrent.ExecutorCompletionService;
18 import java.util.concurrent.Future;
19
20 import junit.framework.Test;
21 import junit.framework.TestSuite;
22
23 public class ExecutorCompletionService9Test extends JSR166TestCase {
24 public static void main(String[] args) {
25 main(suite(), args);
26 }
27 public static Test suite() {
28 return new TestSuite(ExecutorCompletionService9Test.class);
29 }
30
31 void solveAll(Executor e,
32 Collection<Callable<Integer>> solvers)
33 throws InterruptedException, ExecutionException {
34 CompletionService<Integer> cs
35 = new ExecutorCompletionService<>(e);
36 solvers.forEach(cs::submit);
37 for (int i = solvers.size(); i > 0; i--) {
38 Integer r = cs.take().get();
39 if (r != null)
40 use(r);
41 }
42 }
43
44 void solveAny(Executor e,
45 Collection<Callable<Integer>> solvers)
46 throws InterruptedException {
47 CompletionService<Integer> cs
48 = new ExecutorCompletionService<>(e);
49 int n = solvers.size();
50 List<Future<Integer>> futures = new ArrayList<>(n);
51 Integer result = null;
52 try {
53 solvers.forEach((solver) -> futures.add(cs.submit(solver)));
54 for (int i = n; i > 0; i--) {
55 try {
56 Integer r = cs.take().get();
57 if (r != null) {
58 result = r;
59 break;
60 }
61 } catch (ExecutionException ignore) {}
62 }
63 } finally {
64 futures.forEach((future) -> future.cancel(true));
65 }
66
67 if (result != null)
68 use(result);
69 }
70
71 HashSet<Integer> results;
72
73 void use(Integer x) {
74 if (results == null) results = new HashSet<Integer>();
75 results.add(x);
76 }
77
78 /**
79 * The first "solvers" sample code in the class javadoc works.
80 */
81 public void testSolveAll()
82 throws InterruptedException, ExecutionException {
83 Set<Callable<Integer>> solvers = Set.of(
84 () -> null,
85 () -> 1,
86 () -> 2,
87 () -> 3,
88 () -> null);
89 solveAll(cachedThreadPool, solvers);
90 assertEquals(Set.of(1, 2, 3), results);
91 }
92
93 /**
94 * The second "solvers" sample code in the class javadoc works.
95 */
96 public void testSolveAny()
97 throws InterruptedException {
98 Set<Callable<Integer>> solvers = Set.of(
99 () -> { throw new ArithmeticException(); },
100 () -> null,
101 () -> 1,
102 () -> 2);
103 solveAny(cachedThreadPool, solvers);
104 assertEquals(1, results.size());
105 Integer elt = results.iterator().next();
106 assertTrue(elt.equals(1) || elt.equals(2));
107 }
108
109 }