/**
* Copyright (c) 2012-2016 André Bargull
* Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms.
*
* <https://github.com/anba/es6draft>
*/
package com.github.anba.es6draft.runtime.internal;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
*
*/
final class RuntimeWorkerThreadFactory implements ThreadFactory {
private static final int THREAD_POOL_SIZE = 2;
private static final int WORKER_THREAD_CORE_SIZE = 2;
private static final int WORKER_THREAD_POOL_SIZE = 12;
private static final long THREAD_POOL_TTL = 5 * 60;
private static final long WORKER_THREAD_POOL_TTL = 1 * 60;
private static final AtomicInteger runtimeCount = new AtomicInteger(0);
private static final AtomicInteger runtimeWorkerCount = new AtomicInteger(0);
private final AtomicInteger workerCount = new AtomicInteger(0);
private final ThreadGroup group;
private final String namePrefix;
private RuntimeWorkerThreadFactory(String name) {
SecurityManager sec = System.getSecurityManager();
group = sec != null ? sec.getThreadGroup() : Thread.currentThread().getThreadGroup();
namePrefix = name + "-worker-";
}
@Override
public Thread newThread(Runnable r) {
String name = namePrefix + workerCount.incrementAndGet();
Thread newThread = new Thread(group, r, name);
if (!newThread.isDaemon()) {
newThread.setDaemon(true);
}
if (newThread.getPriority() != Thread.NORM_PRIORITY) {
newThread.setPriority(Thread.NORM_PRIORITY);
}
return newThread;
}
/**
* Returns a new {@link ThreadPoolExecutor} to create runtime threads.
*
* @return a new {@link ThreadPoolExecutor} for runtime threads
*/
static ThreadPoolExecutor createThreadPoolExecutor() {
String name = "runtime-" + runtimeCount.incrementAndGet();
ThreadPoolExecutor executor = new ThreadPoolExecutor(THREAD_POOL_SIZE, THREAD_POOL_SIZE, THREAD_POOL_TTL,
TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new RuntimeWorkerThreadFactory(name));
executor.allowCoreThreadTimeOut(true);
return executor;
}
/**
* Returns a new {@link ThreadPoolExecutor} to create runtime worker threads.
*
* @return a new {@link ThreadPoolExecutor} for runtime worker threads
*/
static ThreadPoolExecutor createWorkerThreadPoolExecutor() {
String name = "runtimeworker-" + runtimeWorkerCount.incrementAndGet();
ThreadPoolExecutor executor = new ThreadPoolExecutor(WORKER_THREAD_CORE_SIZE, WORKER_THREAD_POOL_SIZE,
WORKER_THREAD_POOL_TTL, TimeUnit.SECONDS, new SynchronousQueue<>(),
new RuntimeWorkerThreadFactory(name));
executor.allowCoreThreadTimeOut(true);
return executor;
}
}