diff options
-rw-r--r-- | src/jvm/clojure/lang/Agent.java | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/jvm/clojure/lang/Agent.java b/src/jvm/clojure/lang/Agent.java index 7d40ce77..5b6b0124 100644 --- a/src/jvm/clojure/lang/Agent.java +++ b/src/jvm/clojure/lang/Agent.java @@ -12,9 +12,11 @@ package clojure.lang; -import java.util.concurrent.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; -import java.util.Map; public class Agent extends ARef { @@ -34,18 +36,33 @@ static final Keyword CONTINUE = Keyword.intern(null, "continue"); static final Keyword FAIL = Keyword.intern(null, "fail"); volatile Object state; - AtomicReference<ActionQueue> aq = new AtomicReference(ActionQueue.EMPTY); + AtomicReference<ActionQueue> aq = new AtomicReference<ActionQueue>(ActionQueue.EMPTY); volatile Keyword errorMode = CONTINUE; volatile IFn errorHandler = null; +final private static AtomicLong sendThreadPoolCounter = new AtomicLong(0); + +final private static AtomicLong sendOffThreadPoolCounter = new AtomicLong(0); + final public static ExecutorService pooledExecutor = - Executors.newFixedThreadPool(2 + Runtime.getRuntime().availableProcessors()); + Executors.newFixedThreadPool(2 + Runtime.getRuntime().availableProcessors(), + createThreadFactory("clojure-agent-send-pool-%d", sendThreadPoolCounter)); -final public static ExecutorService soloExecutor = Executors.newCachedThreadPool(); +final public static ExecutorService soloExecutor = Executors.newCachedThreadPool( + createThreadFactory("clojure-agent-send-off-pool-%d", sendOffThreadPoolCounter)); final static ThreadLocal<IPersistentVector> nested = new ThreadLocal<IPersistentVector>(); +private static ThreadFactory createThreadFactory(final String format, final AtomicLong threadPoolCounter) { + return new ThreadFactory() { + @Override public Thread newThread(Runnable runnable) { + Thread thread = new Thread(runnable); + thread.setName(String.format(format, threadPoolCounter.getAndIncrement())); + return thread; + } + }; +} public static void shutdown(){ soloExecutor.shutdown(); |