所以,我有一个执行器服务,它创建了 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 之间)
为什么会发生这种情况,我该如何解决?