Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 长时间运行的多线程应用程序部署到tomcat时的运行速度比从命令行运行时慢4倍_Java_Multithreading_Tomcat - Fatal编程技术网

Java 长时间运行的多线程应用程序部署到tomcat时的运行速度比从命令行运行时慢4倍

Java 长时间运行的多线程应用程序部署到tomcat时的运行速度比从命令行运行时慢4倍,java,multithreading,tomcat,Java,Multithreading,Tomcat,当我从命令行运行这个长时间运行的进程时,大约需要30秒才能完成。当我将相同的代码部署到tomcat7并从一个简单的Vaadin web应用程序调用相同的函数时,几乎需要150秒。这是一个特定函数执行的时间,而不是任何与接口相关的减慢它的时间 下面是一个简单的示例,说明了问题: public static void main(String[] args) { try { multiCounter(800); } catch (InterruptedExceptio

当我从命令行运行这个长时间运行的进程时,大约需要30秒才能完成。当我将相同的代码部署到tomcat7并从一个简单的Vaadin web应用程序调用相同的函数时,几乎需要150秒。这是一个特定函数执行的时间,而不是任何与接口相关的减慢它的时间

下面是一个简单的示例,说明了问题:

public static void main(String[] args) {

    try {
        multiCounter(800);
    } catch (InterruptedException | ExecutionException e) {e.printStackTrace();}

    System.out.println("Completed");
}


public static void multiCounter(int numberOfCounters) throws InterruptedException, ExecutionException
{   

    //estimate the number of available processors
    int maxNumberOfThreads = Runtime.getRuntime().availableProcessors();

    //create thread pool and queue for future jobs
    ExecutorService pool = Executors.newFixedThreadPool(maxNumberOfThreads);

    ArrayList<Future<Integer>> futureJobs = new ArrayList<Future <Integer>>();

    for(int index=0; index<numberOfCounters; index++)       
    {
        Callable<Integer> callable = new dummyCalculator();
        Future<Integer> future = pool.submit(callable);
        futureJobs.add(future);
    }

    //placeholder for results
    ArrayList <Integer> results= new ArrayList <Integer>(0);

    //pull completed jobs from queue and extract results,
    //adding to results container
    for(Future<Integer> future : futureJobs) 
    {results.add(future.get());}

    for(Integer res : results)
    {System.out.println("Count:" + res);}

    //close thread pool
    pool.shutdown();
}

final static class dummyCalculator implements Callable<Integer>
{   
    @Override
    public Integer call() throws Exception {

        Integer counter = 0;

        for(int p1Index=0; p1Index<800; p1Index++)
        {   
            for(int p2Index=p1Index; p2Index<800; p2Index++)
            {
                for(int markerIndex=0; markerIndex<200; markerIndex++)
                {counter++;}
            }
        }

        return(counter);
    }
}
publicstaticvoidmain(字符串[]args){
试一试{
多计数器(800);
}catch(InterruptedException | ExecutionException e){e.printStackTrace();}
系统输出打印项次(“完成”);
}
公共静态void多计数器(int numberOfCounters)引发InterruptedException、ExecutionException
{   
//估计可用处理器的数量
int maxNumberOfThreads=Runtime.getRuntime().availableProcessors();
//为将来的作业创建线程池和队列
ExecutorService池=Executors.newFixedThreadPool(maxNumberOfThreads);
ArrayList futureJobs=新ArrayList();

对于(int index=0;index您是否尝试确保Tomcat和您的作业使用的线程总数等于系统上的内核数?我敢说,您可能会更接近这些线程99%的执行率


我的另一个问题是,Tomcat线程的优先级是否高于您的工作线程。如果是这种情况,那么您应该在一致的基础上看到这种差异。我不记得您是否可以使用jconsole或visualvm看到线程优先级,但可能增加线程池的线程优先级会提供但这将影响tomcat处理web请求的能力。

tomcat似乎不太可能/不可能对您发布的特定行的运行时间产生任何影响。您能否从较高的角度概述LongRunningProcess?我认为他们正在做的事情似乎是在放慢速度,而不是在做其他事情你发布了。或者你有什么理由知道这是你发布的控制逻辑,而不是任务逻辑吗?谢谢@Pace,我已经用更完整的代码更新了这个问题,导致了我的tomcat服务器上出现这个问题。即使有这个小循环,在运行tomcat时似乎也要花更长的时间。tomcat是否正忙于获取任何工作k完成了吗?你是不是通过,比如说,发出HTTP请求,给Tomcat增加了负载?@ChristopherSchultz不应该这样,这是唯一正在运行的任务,我是唯一在这台服务器上运行任何东西的人。我在两次试验之间重新启动了Tomcat,只是为了确保某些东西没有被卡住……@Panu关于
安全管理器的好建议,但是真正的工作都是循环和计数,我认为SM没有太多机会参与进来……SM只在被要求对某些事情(如访问文件、系统属性等)进行检查时才进行检查。一旦这些线程启动,它们应该不会出现任何SM问题。不过,值得检查JVM是否启用了
SecurityManager