You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/08/31 07:36:12 UTC
[isis] branch master updated: ISIS-1974: polishing ThreadPoolSupport
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/master by this push:
new 237e0bb ISIS-1974: polishing ThreadPoolSupport
237e0bb is described below
commit 237e0bb9ac7ed6ed3b5b838f52d4c81a884306a0
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Aug 31 09:36:08 2018 +0200
ISIS-1974: polishing ThreadPoolSupport
---
.../core/runtime/threadpool/ThreadPoolSupport.java | 93 +++++++++++++---------
1 file changed, 54 insertions(+), 39 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/runtime/threadpool/ThreadPoolSupport.java b/core/metamodel/src/main/java/org/apache/isis/core/runtime/threadpool/ThreadPoolSupport.java
index 7a37e70..8295e55 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/runtime/threadpool/ThreadPoolSupport.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/runtime/threadpool/ThreadPoolSupport.java
@@ -54,9 +54,16 @@ public final class ThreadPoolSupport implements AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(ThreadPoolSupport.class);
private final ThreadGroup group;
- private final ThreadPoolExecutor executor;
+ private final ThreadPoolExecutor concurrentExecutor;
private final ThreadPoolExecutor sequentialExecutor;
+ /**
+ * @return the application-scoped singleton ThreadPoolSupport instance
+ */
+ public static ThreadPoolSupport getInstance() {
+ return _Context.computeIfAbsent(ThreadPoolSupport.class, __-> new ThreadPoolSupport());
+ }
+
private ThreadPoolSupport() {
group = new ThreadGroup(ThreadPoolSupport.class.getName());
@@ -72,7 +79,7 @@ public final class ThreadPoolSupport implements AutoCloseable {
()->new LinkedBlockingQueue<>(queueCapacity);
- executor = new ThreadPoolExecutor(
+ concurrentExecutor = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTimeSecs, TimeUnit.SECONDS,
@@ -85,7 +92,44 @@ public final class ThreadPoolSupport implements AutoCloseable {
threadFactory);
}
+
+ /*
+ * Implementation Note: triggered by _Context.clear() when application shuts down.
+ */
+ @Override
+ public void close() throws Exception {
+ try {
+ concurrentExecutor.shutdown();
+ } finally {
+ // in case the previous throws, continue execution here
+ sequentialExecutor.shutdown();
+ }
+ }
+ /**
+ * Executes specified {@code callables} on the default executor.
+ * See {@link ThreadPoolExecutor#invokeAll(java.util.Collection)}
+ * @param callables nullable
+ * @return non-null
+ */
+ public List<Future<Object>> invokeAll(@Nullable final List<Callable<Object>> callables) {
+ return invokeAll(concurrentExecutor, callables);
+ }
+
+ /**
+ * Executes specified {@code callables} on the sequential executor in sequence, one by one.
+ * @param callables nullable
+ * @return non-null
+ */
+ public List<Future<Object>> invokeAllSequential(@Nullable final List<Callable<Object>> callables) {
+ return invokeAll(sequentialExecutor, callables);
+ }
+
+ /**
+ * Waits if necessary for the computation to complete. (Suppresses checked exceptions.)
+ * @param futures
+ * @return list of computation results.
+ */
public static List<Object> join(final List<Future<Object>> futures) {
if (futures == null) {
return null;
@@ -104,6 +148,11 @@ public final class ThreadPoolSupport implements AutoCloseable {
}
}
+ /**
+ * Waits if necessary for the computation to complete. (Suppresses checked exceptions.)
+ * @param future
+ * @return the computation result
+ */
public static Object join(final Future<Object> future) {
try {
return future.get();
@@ -113,13 +162,9 @@ public final class ThreadPoolSupport implements AutoCloseable {
return null;
}
- /**
- * Executes specified {@code callables} on the default executor.
- * See {@link ThreadPoolExecutor#invokeAll(java.util.Collection)}
- * @param callables nullable
- * @return non-null
- */
- public List<Future<Object>> invokeAll(@Nullable final List<Callable<Object>> callables) {
+ // -- HELPER
+
+ private List<Future<Object>> invokeAll(ThreadPoolExecutor executor, @Nullable final List<Callable<Object>> callables) {
if(isEmpty(callables)) {
return Collections.emptyList();
}
@@ -130,34 +175,4 @@ public final class ThreadPoolSupport implements AutoCloseable {
}
}
- /**
- * Executes specified {@code callables} on the sequential executor in sequence, one by one.
- * @param callables nullable
- * @return non-null
- */
- public List<Future<Object>> invokeAllSequential(@Nullable final List<Callable<Object>> callables) {
- if(isEmpty(callables)) {
- return Collections.emptyList();
- }
- try {
- return sequentialExecutor.invokeAll(callables);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
-
- public static ThreadPoolSupport getInstance() {
- return _Context.computeIfAbsent(ThreadPoolSupport.class, __-> new ThreadPoolSupport());
- }
-
- @Override
- public void close() throws Exception {
- try {
- executor.shutdown();
- } finally {
- // in case the previous throws, continue execution here
- sequentialExecutor.shutdown();
- }
- }
-
}