0

したがって、それぞれの間に250ミリ秒のスリープがある12個のスレッドを作成するエグゼキュータサービスがあります。この時間は通常、ほとんどのスレッドが完了するのに十分ですが、特にプロセス集約的で、通常は約7時間かかる1つのスレッドを作成します。 -解析に10秒。

これをメインスレッドで実行すると、エラーなしで完了しますが、エグゼキュータサービスにフィードすると、エラーは発生しません。

これが私のコードです:

public static void main(String args[]){
ExecutorService threadPool = Executors.newFixedThreadPool(12);
...
Thread.sleep(250);
OPA.OpaHandler OpaSH = new OPA.OpaHandler();
    threadPool.submit(new ThreadHandler(OpaSH, 7));
Thread.sleep(250);
...

ThreadHandler.java
....
 public void run(){
    double startTime;
    double endTime;
        switch(this.threadNum){
....
          case 7:{
               startTime = System.nanoTime();
               OpaSH.run();
               endTime = System.nanoTime();
               endTime = endTime - startTime;
               System.out.println("Thread 7 (OPA) took:" + (endTime/1000000000) + " seconds. to run");
               break;
           }

OpaSH.run()の唯一の注目すべき部分。

 supply = new double[9];
        // Create an XML reader
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse(in);

        //Parse the Xml.
        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        XPathExpression expr = xpath.compile("//Stuff[1]/text()");

        result = (String) expr.evaluate(doc, XPathConstants.STRING);
        supply[0] = Double.parseDouble(result);

        expr = xpath.compile("//Stuff[2]/text()");

        result = (String) expr.evaluate(doc, XPathConstants.STRING);
        supply[1] = Double.parseDouble(result);

        ....

実行されるスレッドは合計12個あり、それぞれを完了するまでの時間は、計算に0.07秒から0.8秒の間です。かなり時間がかかる2つがあります(約9秒とOPAは1秒から55秒までのどこかになります)

なぜこれが起こっているのですか、どうすれば修正できますか?

4

0 に答える 0