【发布时间】:2015-08-04 06:03:27
【问题描述】:
我已经使用托管在 Tomcat 7 上的 JSP-Servlet 创建了简单的 Web 应用程序。根据我的要求,我需要创建 2 个后台线程,它们将在一段时间内不断检查它们各自的共享队列,以及是否在它们的它将处理该元素的各个队列。
对于这2个连续线程管理,我使用了java.util.concurrent.Executors。它对我来说很好,但问题是, java.lang.Thread.activeCount() 只有当我执行一些操作以在资源队列中添加元素时才会增加。此外,当我检查 Java VisualVM 时,它显示线程数不断增加。
以下是我的代码段:
Web.xml:
<servlet>
<servlet-name>InvokerServlet</servlet-name>
<display-name>InvokerServlet</display-name>
<description></description>
<servlet-class>com.test.servlet.InvokerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
这是在tomcat启动时启动我的InvokerServlet,它将启动线程:
InvokerServlet.java:
public class InvokerServlet extends HttpServlet {
Logger log = Logger.getLogger(InvokerServlet.class);
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public InvokerServlet() {
super();
log.debug("Initiate thread invoking");
new ThreadInvoker().invokeThreads();
}
...
...
}
ThreadInvoker.java:
public class ThreadInvoker
{
Thread1 t1 = new Thread1();
Thread2 t2 = new Thread2();
public static Queue queue1 = new LinkedBlockingQueue();
public static Queue queue2 = new LinkedBlockingQueue();
private static ExecutorService executor = null;
private static volatile Future result1= null;
private static volatile Future result2 = null;
public void invokeThreads()
{
executor = Executors.newFixedThreadPool(2);
while (true)
{
System.out.println("----> " + java.lang.Thread.activeCount());
try
{
checkTasks();
Thread.sleep(1000);
} catch (Exception e) {
System.err.println("Caught exception: " + e.getMessage());
}
}
}
private void checkTasks() throws Exception
{
if(queue1.size() > 0)
{
result1 = executor.submit(t1);
}
if(queue2.size() > 0)
{
result2 = executor.submit(t2);
}
}
}
Thread1.java
public class Thread1 implements Runnable
{
public void run()
{
try
{
log.debug("Inside Thread1 run");
Thread.sleep(2000);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
Thread2.java
public class Thread2 implements Runnable
{
public void run()
{
try
{
log.debug("Inside Thread2 run");
Thread.sleep(2000);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
所以我的问题是为什么当我通过一些外部操作在 queue1 和 queue2 中添加元素时活动线程计数会增加。为什么他们各自的线程完成工作后它不会减少?
如果我做错了,请告诉我。
【问题讨论】:
-
使用线程池。它已经在做你想要重塑的事情。
标签: java multithreading tomcat threadpoolexecutor