package de.invesdwin.util.concurrent; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy; import java.util.concurrent.TimeUnit; import javax.annotation.concurrent.Immutable; import io.netty.util.concurrent.DefaultThreadFactory; /** * As an alternative to the java executors class. Here more conventions are kept for all executors. * * @author subes * */ @Immutable public final class Executors { private static int cpuThreadPoolCount = Runtime.getRuntime().availableProcessors(); private Executors() {} /** * @see java.util.concurrent.Executors.newCachedThreadPool */ public static WrappedExecutorService newCachedThreadPool(final String name) { final java.util.concurrent.ThreadPoolExecutor ex = (java.util.concurrent.ThreadPoolExecutor) java.util.concurrent.Executors .newCachedThreadPool(newFastThreadLocalThreadFactory(name)); return new WrappedExecutorService(ex, name); } public static WrappedThreadFactory newFastThreadLocalThreadFactory(final String name) { return new WrappedThreadFactory(name, new DefaultThreadFactory(name)); } /** * @see java.util.concurrent.Executors.newFixedThreadPool */ public static WrappedExecutorService newFixedThreadPool(final String name, final int nThreads) { final java.util.concurrent.ThreadPoolExecutor ex = (java.util.concurrent.ThreadPoolExecutor) java.util.concurrent.Executors .newFixedThreadPool(nThreads, newFastThreadLocalThreadFactory(name)); return new WrappedExecutorService(ex, name); } /** * @see java.util.concurrent.Executors.newScheduledThreadPool */ public static WrappedScheduledExecutorService newScheduledThreadPool(final String name) { final java.util.concurrent.ScheduledThreadPoolExecutor ex = (java.util.concurrent.ScheduledThreadPoolExecutor) java.util.concurrent.Executors .newScheduledThreadPool(Integer.MAX_VALUE, newFastThreadLocalThreadFactory(name)); return new WrappedScheduledExecutorService(ex, name); } /** * @see java.util.concurrent.Executors.newScheduledThreadPool */ public static WrappedScheduledExecutorService newScheduledThreadPool(final String name, final int corePoolSize) { final java.util.concurrent.ScheduledThreadPoolExecutor ex = (java.util.concurrent.ScheduledThreadPoolExecutor) java.util.concurrent.Executors .newScheduledThreadPool(corePoolSize, newFastThreadLocalThreadFactory(name)); return new WrappedScheduledExecutorService(ex, name); } public static WrappedExecutorService newFixedCallerRunsThreadPool(final String name, final int nThreads) { final java.util.concurrent.ThreadPoolExecutor ex = new java.util.concurrent.ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(nThreads), newFastThreadLocalThreadFactory(name), new CallerRunsPolicy()); return new WrappedExecutorService(ex, name); } /** * Returns the number of cpu cores for ThreadPools that are cpu intensive. */ public static int getCpuThreadPoolCount() { return Executors.cpuThreadPoolCount; } public static void setCpuThreadPoolCount(final int cpuThreadPoolCount) { Executors.cpuThreadPoolCount = cpuThreadPoolCount; } public static ConfiguredForkJoinPool newForkJoinPool(final String name, final int parallelism) { return new ConfiguredForkJoinPool(name, parallelism, false); } public static ConfiguredForkJoinPool newAsyncForkJoinPool(final String name, final int parallelism) { return new ConfiguredForkJoinPool(name, parallelism, true); } }