1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19 package org.apache.maven.surefire.junitcore.pc;
20
21 import java.util.Queue;
22 import java.util.concurrent.ConcurrentLinkedQueue;
23
24 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
25
26 /**
27 * The sequentially executing strategy in private package.
28 *
29 * @author Tibor Digana (tibor17)
30 * @see SchedulingStrategy
31 * @since 2.16
32 */
33 final class InvokerStrategy extends SchedulingStrategy {
34
35 private final Queue<Thread> activeThreads = new ConcurrentLinkedQueue<>();
36
37 protected InvokerStrategy(ConsoleLogger logger) {
38 super(logger);
39 }
40
41 @Override
42 public void schedule(Runnable task) {
43 if (canSchedule()) {
44 final Thread currentThread = Thread.currentThread();
45 try {
46 activeThreads.add(currentThread);
47 task.run();
48 } finally {
49 activeThreads.remove(currentThread);
50 }
51 }
52 }
53
54 @Override
55 protected boolean stop() {
56 return disable();
57 }
58
59 @Override
60 protected boolean stopNow() {
61 final boolean stopped = disable();
62
63 for (Thread activeThread = activeThreads.poll(); activeThread != null; activeThread = activeThreads.poll()) {
64 activeThread.interrupt();
65 }
66 return stopped;
67 }
68
69 @Override
70 public boolean hasSharedThreadPool() {
71 return false;
72 }
73
74 @Override
75 public boolean finished() throws InterruptedException {
76 return disable();
77 }
78
79 @Override
80 public boolean destroy() {
81 return stop();
82 }
83 }