我已经使用托管在 Tomcat 7 上的 JSP-Servlet 创建了简单的 Web 应用程序。根据我的要求,我需要创建 2 个后台线程,它们将在一段时间内持续检查它们各自的共享队列,以及是否在它们的队列中找到任何元素它将处理该元素的各个队列。
对于这 2 个连续线程管理,我使用了 java.util.concurrent.Executors。它对我来说工作正常,但问题是,java.lang.Thread.activeCount() 只有在我执行一些操作以在资源队列中添加元素时才会增加。此外,当我检查 Java VisualVM 时,它显示线程数不断增加。
以下是我的代码段:
网络.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();
}
...
...
}
线程调用者.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);
}
}
}
线程1.java
public class Thread1 implements Runnable
{
public void run()
{
try
{
log.debug("Inside Thread1 run");
Thread.sleep(2000);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
线程2.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 中添加元素时,为什么 Activity 线程数会增加。为什么在各自的线程完成工作后它不会递减?
如果我做错了,请告诉我。
最佳答案
我希望您正在试验并且这不是全部代码。从您的代码 InvokerServlet
将永远不会完成,因为构造函数会继续进行无休止的 while 循环。因为,new ThreadInvoker().invokeThreads()
永远不会完成。
如果您只想查看执行程序的线程计数,您应该使用它,并且计数不会增加超过您配置的2。
System.out.println("----> " + ((ThreadPoolExecutor)executor).getActiveCount());
我希望越来越多的线程不是执行线程,而是将元素放入队列的线程。如果进行线程转储,您就会知道这些线程在做什么以及它们在等待谁。这会给你一个答案,为什么这些线程在增加。
您不会从队列中出队 - 但是,这现在不应该阻止您。它可以继续,直到您添加计数 Integer.MAX_VALUE
关于java - Tomcat 线程数只会增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31801766/