summaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com/yahoo/container/handler/threadpool/ContainerThreadPool.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-core/src/main/java/com/yahoo/container/handler/threadpool/ContainerThreadPool.java')
-rw-r--r--container-core/src/main/java/com/yahoo/container/handler/threadpool/ContainerThreadPool.java84
1 files changed, 3 insertions, 81 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/handler/threadpool/ContainerThreadPool.java b/container-core/src/main/java/com/yahoo/container/handler/threadpool/ContainerThreadPool.java
index 294453aa8ba..35bd807b126 100644
--- a/container-core/src/main/java/com/yahoo/container/handler/threadpool/ContainerThreadPool.java
+++ b/container-core/src/main/java/com/yahoo/container/handler/threadpool/ContainerThreadPool.java
@@ -1,95 +1,17 @@
// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.container.handler.threadpool;
-import com.google.inject.Inject;
-import com.yahoo.component.AbstractComponent;
-import com.yahoo.concurrent.ThreadFactoryFactory;
-import com.yahoo.container.protect.ProcessTerminator;
-import com.yahoo.jdisc.Metric;
-
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
-import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.TimeUnit;
/**
* A configurable thread pool. This provides the worker threads used for normal request processing.
*
- * @author Steinar Knutsen
- * @author baldersheim
- * @author bratseth
* @author bjorncs
*/
-public class ContainerThreadPool extends AbstractComponent implements AutoCloseable {
-
- private final ExecutorServiceWrapper threadpool;
-
- @Inject
- public ContainerThreadPool(ContainerThreadpoolConfig config, Metric metric) {
- this(config, metric, new ProcessTerminator());
- }
-
- public ContainerThreadPool(ContainerThreadpoolConfig config, Metric metric, ProcessTerminator processTerminator) {
- ThreadPoolMetric threadPoolMetric = new ThreadPoolMetric(metric, config.name());
- int maxNumThreads = computeMaximumThreadPoolSize(config.maxThreads());
- int coreNumThreads = computeCoreThreadPoolSize(config.minThreads(), maxNumThreads);
- WorkerCompletionTimingThreadPoolExecutor executor =
- new WorkerCompletionTimingThreadPoolExecutor(coreNumThreads, maxNumThreads,
- (int)config.keepAliveTime() * 1000, TimeUnit.MILLISECONDS,
- createQ(config.queueSize(), maxNumThreads),
- ThreadFactoryFactory.getThreadFactory(config.name()),
- threadPoolMetric);
- // Prestart needed, if not all threads will be created by the fist N tasks and hence they might also
- // get the dreaded thread locals initialized even if they will never run.
- // That counters what we we want to achieve with the Q that will prefer thread locality.
- executor.prestartAllCoreThreads();
- threadpool = new ExecutorServiceWrapper(executor, threadPoolMetric, processTerminator,
- config.maxThreadExecutionTimeSeconds() * 1000L);
- }
-
- public Executor executor() { return threadpool; }
- public int queuedTasks() { return threadpool.queuedTasks(); }
- @Override public void close() { closeInternal(); }
- @Override public void deconstruct() { closeInternal(); super.deconstruct(); }
-
- /**
- * Shutdown the thread pool, give a grace period of 1 second before forcibly
- * shutting down all worker threads.
- */
- private void closeInternal() {
- boolean terminated;
-
- threadpool.shutdown();
- try {
- terminated = threadpool.awaitTermination(1, TimeUnit.SECONDS);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- return;
- }
- if (!terminated) {
- threadpool.shutdownNow();
- }
- }
-
- private static BlockingQueue<Runnable> createQ(int queueSize, int maxThreads) {
- return (queueSize == 0)
- ? new SynchronousQueue<>(false)
- : (queueSize < 0)
- ? new ArrayBlockingQueue<>(maxThreads*4)
- : new ArrayBlockingQueue<>(queueSize);
- }
+public interface ContainerThreadPool extends AutoCloseable {
- private static int computeMaximumThreadPoolSize(int maxNumThreads) {
- return (maxNumThreads <= 0)
- ? Runtime.getRuntime().availableProcessors() * 4
- : maxNumThreads;
- }
+ Executor executor();
- private static int computeCoreThreadPoolSize(int corePoolSize, int maxNumThreads) {
- return Math.min(
- corePoolSize <= 0 ? Runtime.getRuntime().availableProcessors() * 2 : corePoolSize,
- maxNumThreads);
- }
+ default void close() {}
}