View Javadoc

1   package org.apache.maven.surefire.junitcore.pc;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *     http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.util.concurrent.CancellationException;
23  import java.util.concurrent.ConcurrentLinkedQueue;
24  import java.util.concurrent.ExecutionException;
25  import java.util.concurrent.ExecutorService;
26  import java.util.concurrent.Future;
27  
28  /**
29   * Parallel strategy for shared thread pool in private package.
30   *
31   * @author Tibor Digana (tibor17)
32   * @since 2.16
33   *
34   * @see AbstractThreadPoolStrategy
35   */
36  final class SharedThreadPoolStrategy extends AbstractThreadPoolStrategy {
37      SharedThreadPoolStrategy(ExecutorService threadPool) {
38          super(threadPool, new ConcurrentLinkedQueue<Future<?>>());
39      }
40  
41      @Override
42      public boolean hasSharedThreadPool() {
43          return true;
44      }
45  
46      @Override
47      public boolean finished() throws InterruptedException {
48          boolean wasRunningAll = canSchedule();
49          for (Future<?> futureResult : getFutureResults()) {
50              try {
51                  futureResult.get();
52              } catch (InterruptedException e) {
53                  // after called external ExecutorService#shutdownNow()
54                  // or ExecutorService#shutdown()
55                  wasRunningAll = false;
56              } catch (ExecutionException e) {
57                  // test throws exception
58              } catch (CancellationException e) {
59                  // cannot happen because not calling Future#cancel()
60              }
61          }
62          disable();
63          return wasRunningAll;
64      }
65  
66      @Override
67      protected final boolean stop() {
68          return stop(false);
69      }
70  
71      @Override
72      protected final boolean stopNow() {
73          return stop(true);
74      }
75  
76      private boolean stop(boolean interrupt) {
77          final boolean wasRunning = canSchedule();
78          for (Future<?> futureResult : getFutureResults()) {
79              futureResult.cancel(interrupt);
80          }
81          disable();
82          return wasRunning;
83      }
84  }