java - Tomcat 线程数只会增加

标签 java multithreading tomcat threadpoolexecutor

我已经使用托管在 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/

相关文章:

java - 如何通过专门的比较方式检查列表中是否存在对象?

java - 在 OpenCV 中从回调方法获取图像而不阻塞

java - Spring Tomcat : Non-whitespace characters are not allowed in schema elements . 锯 '301 Moved Permanently'

xml - InelliJ和apache tomcat8在.IntelliJIdea15/system/tomcat/Unnamed_Form/conf目录下发现没有server.xml

java - tomcat 服务器上的 Intellij Web 应用程序显示 http ://localhost:8080/index. jsp 而不是 http ://localhost:8080/myapp/index. jsp

Javafx Tableview保存数据无需回车键

Java Lambda - 尝试按 2 组求和

java - 编写一个返回对象数组中最大对象的方法

ConsoleApp 中的 c# WebBrowser Print() 线程

multithreading - 更改 Julia 的 Jupyter Notebooks 的 VS Code 的 settings.json 中的线程