0

所以,我有一个执行器服务,它创建了 12 个线程,每个线程之间有 250 毫秒的睡眠,这段时间通常足以让我的大多数线程完成,但是我创建了一个进程特别密集的线程,通常需要大约 7 -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.07s 到 0.8s 之间。有两个需要更长的时间(大约 9s 和 OPA,可以在 1s 到 55s 之间)

为什么会发生这种情况,我该如何解决?

4

0 回答 0