したがって、それぞれの間に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秒までのどこかになります)
なぜこれが起こっているのですか、どうすれば修正できますか?