Author: norman
Date: Thu Nov 11 11:08:42 2010
New Revision: 1033885
URL: http://svn.apache.org/viewvc?rev=1033885&view=rev
Log:
register threadpools in jmx which are used for netty (JAMES-1057)
Added:
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutor.java
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutorMBean.java
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/NamedThreadFactory.java
Modified:
james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
james/server/trunk/netty-socket/pom.xml
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractConfigurableAsyncServer.java
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/RemoteManager.java
james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTest.java
james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
Modified:
james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
---
james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
(original)
+++
james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
Thu Nov 11 11:08:42 2010
@@ -163,5 +163,10 @@ public class IMAPServer extends Abstract
return connectionLimit;
}
+ @Override
+ protected String getDefaultJMXName() {
+ return "imapserver";
+ }
+
}
Modified:
james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
---
james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
(original)
+++
james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
Thu Nov 11 11:08:42 2010
@@ -255,4 +255,10 @@ public class LMTPServer extends Abstract
return "unknown";
}
+
+ @Override
+ protected String getDefaultJMXName() {
+ return "lmtpserver";
+ }
+
}
Modified: james/server/trunk/netty-socket/pom.xml
URL:
http://svn.apache.org/viewvc/james/server/trunk/netty-socket/pom.xml?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
--- james/server/trunk/netty-socket/pom.xml (original)
+++ james/server/trunk/netty-socket/pom.xml Thu Nov 11 11:08:42 2010
@@ -90,6 +90,16 @@
</dependency>
<dependency>
<groupId>org.apache.james</groupId>
+ <artifactId>james-server-util</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>javax.mail</groupId>
+ <artifactId>mail</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.james</groupId>
<artifactId>james-server-dnsservice-api</artifactId>
</dependency>
<dependency>
Modified:
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractConfigurableAsyncServer.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractConfigurableAsyncServer.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
---
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractConfigurableAsyncServer.java
(original)
+++
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractConfigurableAsyncServer.java
Thu Nov 11 11:08:42 2010
@@ -22,6 +22,7 @@ import java.io.FileInputStream;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.KeyStore;
+import java.util.concurrent.Executor;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@@ -39,6 +40,7 @@ import org.apache.james.lifecycle.LogEna
import org.apache.james.protocols.impl.AbstractAsyncServer;
import org.apache.james.services.FileSystem;
import org.apache.james.socket.ServerMBean;
+import org.apache.james.util.concurrent.JMXEnabledThreadPoolExecutor;
/**
@@ -94,6 +96,8 @@ public abstract class AbstractConfigurab
private SSLContext context;
+ private String jmxName;
+
@Resource(name="dnsservice")
public final void setDNSService(DNSService dns) {
this.dns = dns;
@@ -152,6 +156,7 @@ public abstract class AbstractConfigurab
throw new ConfigurationException( "Malformed bind parameter in
configuration of service " + getServiceType(), unhe );
}
+ jmxName = config.getString("jmxName",getDefaultJMXName());
configureHelloName(handlerConfiguration);
setTimeout(handlerConfiguration.getInt(TIMEOUT_NAME,DEFAULT_TIMEOUT));
@@ -437,5 +442,22 @@ public abstract class AbstractConfigurab
public int getMaximumConcurrentConnections() {
return connectionLimit;
}
+
+ @Override
+ protected Executor createBossExecutor() {
+ return
JMXEnabledThreadPoolExecutor.newCachedThreadPool("org.apache.james:type=server,name="
+ jmxName + ",sub-type=threadpool", "boss");
+ }
+
+ @Override
+ protected Executor createWorkerExecutor() {
+ return
JMXEnabledThreadPoolExecutor.newCachedThreadPool("org.apache.james:type=server,name="
+ jmxName + ",sub-type=threadpool", "worker");
+ }
+ /**
+ * Return the default name of the the server in JMX if none is configured
via "jmxname" in the configuration
+ *
+ * @return defaultJmxName
+ */
+ protected abstract String getDefaultJMXName();
+
}
Modified:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
---
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
(original)
+++
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
Thu Nov 11 11:08:42 2010
@@ -175,4 +175,9 @@ public class POP3Server extends Abstract
return countHandler.getCurrentConnectionCount();
}
+ @Override
+ protected String getDefaultJMXName() {
+ return "pop3server";
+ }
+
}
Modified:
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
---
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
(original)
+++
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
Thu Nov 11 11:08:42 2010
@@ -47,4 +47,11 @@ public class POP3ServerTest extends Abst
m_pop3Server.setMailServer(m_mailServer);
}
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ m_pop3Server.destroy();
+
+ }
+
}
Modified:
james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/RemoteManager.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/RemoteManager.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
---
james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/RemoteManager.java
(original)
+++
james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/RemoteManager.java
Thu Nov 11 11:08:42 2010
@@ -164,5 +164,9 @@ public class RemoteManager extends Abstr
}
+ @Override
+ protected String getDefaultJMXName() {
+ return "remotemanager";
+ }
}
Modified:
james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTest.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTest.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
---
james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTest.java
(original)
+++
james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTest.java
Thu Nov 11 11:08:42 2010
@@ -44,4 +44,10 @@ public class RemoteManagerTest extends A
}
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ remotemanager.destroy();
+ }
+
}
Modified:
james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
---
james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
(original)
+++
james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
Thu Nov 11 11:08:42 2010
@@ -390,4 +390,14 @@ public class SMTPServer extends Abstract
public String getNetworkInterface() {
return "unknown";
}
+
+
+ @Override
+ protected String getDefaultJMXName() {
+ return "smtpserver";
+ }
+
+
+
+
}
Modified:
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
---
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java
(original)
+++
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java
Thu Nov 11 11:08:42 2010
@@ -190,6 +190,7 @@ public abstract class AbstractSMTPServer
LifecycleUtil.dispose(m_mailServer);
queue.clear();
super.tearDown();
+
}
public void verifyLastMail(String sender, String recipient, MimeMessage
msg) throws IOException, MessagingException {
Modified:
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
---
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
(original)
+++
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
Thu Nov 11 11:08:42 2010
@@ -49,6 +49,13 @@ public class SMTPServerTest extends Abst
m_smtpServer.setMailServer(m_mailServer);
}
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ m_smtpServer.destroy();
+
+ }
+
public void testMaxLineLength() throws Exception {
finishSetUp(m_testConfiguration);
Added:
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutor.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutor.java?rev=1033885&view=auto
==============================================================================
---
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutor.java
(added)
+++
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutor.java
Thu Nov 11 11:08:42 2010
@@ -0,0 +1,183 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+package org.apache.james.util.concurrent;
+
+import java.lang.management.ManagementFactory;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+/**
+ * {...@link ThreadPoolExecutor} which expose statistics via JMX
+ *
+ */
+public class JMXEnabledThreadPoolExecutor extends ThreadPoolExecutor
implements JMXEnabledThreadPoolExecutorMBean {
+
+ private String jmxPath;
+ private final List<Runnable> inProgress = Collections.synchronizedList(new
ArrayList<Runnable>());
+ private final ThreadLocal<Long> startTime = new ThreadLocal<Long>();
+ private long totalTime;
+ private int totalTasks;
+ private MBeanServer mbeanServer;
+ private String mbeanName;
+
+ public JMXEnabledThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> queue,
NamedThreadFactory tFactory, String jmxPath) {
+ super(corePoolSize, maximumPoolSize, keepAliveTime, unit, queue,
tFactory);
+ this.jmxPath = jmxPath;
+ registerMBean();
+ }
+
+ protected void beforeExecute(Thread t, Runnable r) {
+ super.beforeExecute(t, r);
+ inProgress.add(r);
+ startTime.set(System.currentTimeMillis());
+ }
+
+ protected void afterExecute(Runnable r, Throwable t) {
+ long time = System.currentTimeMillis() - startTime.get().longValue();
+ synchronized (this) {
+ totalTime += time;
+ ++totalTasks;
+ }
+ inProgress.remove(r);
+ super.afterExecute(r, t);
+ }
+
+ private void registerMBean() {
+ if (jmxPath != null) {
+ mbeanServer = ManagementFactory.getPlatformMBeanServer();
+ mbeanName = jmxPath + ",threadpool=" +
((NamedThreadFactory)getThreadFactory()).getName();
+ try {
+ mbeanServer.registerMBean(this, new ObjectName(mbeanName));
+ } catch (Exception e) {
+ throw new RuntimeException("Unable to register mbean" , e);
+ }
+ }
+ }
+
+ private void unregisterMBean(){
+ if (jmxPath != null) {
+ try {
+ mbeanServer.unregisterMBean(new ObjectName(mbeanName));
+
+ } catch (Exception e) {
+ throw new RuntimeException("Unable to unregister mbean" , e);
+ }
+ }
+ }
+
+ @Override
+ public synchronized void shutdown()
+ {
+ // synchronized, because there is no way to access super.mainLock,
which would be
+ // the preferred way to make this threadsafe
+ if (!isShutdown())
+ {
+ unregisterMBean();
+ }
+ super.shutdown();
+ }
+
+ @Override
+ public synchronized List<Runnable> shutdownNow()
+ {
+ // synchronized, because there is no way to access super.mainLock,
which would be
+ // the preferred way to make this threadsafe
+ if (!isShutdown())
+ {
+ unregisterMBean();
+ }
+ return super.shutdownNow();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.james.util.concurrent.JMXEnabledThreadPoolExecutorMBean#getTotalTasks()
+ */
+ public synchronized int getTotalTasks() {
+ return totalTasks;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.james.util.concurrent.JMXEnabledThreadPoolExecutorMBean#getAverageTaskTime()
+ */
+ public synchronized double getAverageTaskTime() {
+ return (totalTasks == 0) ? 0 : totalTime / totalTasks;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.james.util.concurrent.JMXEnabledThreadPoolExecutorMBean#getActiveThreads()
+ */
+ public int getActiveThreads() {
+ return getPoolSize();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.james.util.concurrent.JMXEnabledThreadPoolExecutorMBean#getActiveTasks()
+ */
+ public int getActiveTasks() {
+ return getActiveCount();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.james.util.concurrent.JMXEnabledThreadPoolExecutorMBean#getQueuedTasks()
+ */
+ public int getQueuedTasks() {
+ return getQueue().size();
+ }
+
+ /**
+ * Create a cached instance of this class. If jmxPath is null it will not
register itself to the {...@link MBeanServer}
+ *
+ * @param jmxPath
+ * @param name
+ * @return pool
+ *
+ */
+ public static JMXEnabledThreadPoolExecutor newCachedThreadPool(String
jmxPath, String name) {
+ return new JMXEnabledThreadPoolExecutor(0, Integer.MAX_VALUE,
+ 60L, TimeUnit.SECONDS,
+ new SynchronousQueue<Runnable>(), new
NamedThreadFactory(name), jmxPath);
+
+ }
+
+ /**
+ * Create a cached instance of this class. If jmxPath is null it will not
register itself to the {...@link MBeanServer}
+ *
+ * @param jmxPath
+ * @param factory
+ * @return pool
+ */
+ public static JMXEnabledThreadPoolExecutor newCachedThreadPool(String
jmxPath, NamedThreadFactory factory) {
+ return new JMXEnabledThreadPoolExecutor(0, Integer.MAX_VALUE,
+ 60L, TimeUnit.SECONDS,
+ new SynchronousQueue<Runnable>(), factory, jmxPath);
+ }
+}
Added:
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutorMBean.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutorMBean.java?rev=1033885&view=auto
==============================================================================
---
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutorMBean.java
(added)
+++
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutorMBean.java
Thu Nov 11 11:08:42 2010
@@ -0,0 +1,57 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+package org.apache.james.util.concurrent;
+
+public interface JMXEnabledThreadPoolExecutorMBean {
+
+ /**
+ * Return the active threads
+ *
+ * @return aThreads
+ */
+ public int getActiveThreads();
+
+ /**
+ * Return the active Tasks
+ *
+ * @return aTasks
+ */
+ public int getActiveTasks();
+
+ /**
+ * Return the total tasks handled by this executor
+ *
+ * @return tTasks
+ */
+ public int getTotalTasks();
+
+ /**
+ * Return the queued tasks
+ *
+ * @return qTasks
+ */
+ public int getQueuedTasks();
+
+ /**
+ * Return the average time for a task (in ms)
+ *
+ * @return aTime
+ */
+ public double getAverageTaskTime();
+}
Added:
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/NamedThreadFactory.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/NamedThreadFactory.java?rev=1033885&view=auto
==============================================================================
---
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/NamedThreadFactory.java
(added)
+++
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/NamedThreadFactory.java
Thu Nov 11 11:08:42 2010
@@ -0,0 +1,71 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+package org.apache.james.util.concurrent;
+
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * ThreadPool which use name and a counter for thread names
+ *
+ */
+public class NamedThreadFactory implements ThreadFactory{
+
+ public final String name;
+ private final AtomicLong count = new AtomicLong();
+ private int priority;
+
+ public NamedThreadFactory(final String name, final int priority) {
+ if (priority > Thread.MAX_PRIORITY || priority < Thread.MIN_PRIORITY) {
+ throw new IllegalArgumentException("Priority must be <= " +
Thread.MAX_PRIORITY + " and >=" + Thread.MIN_PRIORITY);
+ }
+ this.name = name;
+ this.priority = priority;
+ }
+
+ public NamedThreadFactory(final String name) {
+ this(name, Thread.NORM_PRIORITY);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.util.concurrent.ThreadFactory#newThread(java.lang.Runnable)
+ */
+ public Thread newThread(Runnable r) {
+ Thread t = new Thread(r);
+ t.setName(name + "-" + count.incrementAndGet());
+ t.setPriority(priority);
+ return t;
+ }
+
+ /**
+ * Return the name
+ *
+ * @return name
+ */
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String toString() {
+ return "NamedTreadFactory: " + getName();
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]