主要流程:
int cpus = Runtime.getRuntime().availableProcessors();
ExecutorService executor = Executors.newFixedThreadPool(cpus);
List<Callable<Object>> todo = new ArrayList<Callable<Object>>(lines.size());
for (int r = 0; r < lines.size(); r++) {
String filename = r + 1 + "";
todo.add(Executors.callable(new AppConsole(filename, lines.get(r))));
}
List<Future<Object>> answers = executor.invokeAll(todo);
AppConsole类实现了Runnable,重写的run方法如下:
public void run() {
try{
} catch (SecurityException exception) {
exception.printStackTrace();
} catch (FileNotFoundException exception) {
exception.printStackTrace();
} catch (IOException exception) {
exception.printStackTrace();
} catch (SAXException exception) {
exception.printStackTrace();
} catch (Exception exception) {
exception.printStackTrace();
} finally {
if (output != null) {
output.close();
}
}
}
}
由于其中一个线程抛出连接超时异常,主进程已挂起且无法完成。现在我可以看到 cpu 使用率下降到 0%,并且内存消耗在挂起时保持在相同水平。
有人可以帮我解决这个问题吗?至少,帮我完成主要流程吧?
最佳答案
抛出异常会释放任务和主线程。 ExecutorService 将异常抛出视为另一个返回值,并且处理它不会出现问题。
主线程只会阻塞等待任务之一完成。我会查看仍然处于 Activity 状态的任务/线程,以了解它们正在做什么,例如也许它们还没有超时。
关于Java 主进程因线程抛出异常而挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18075277/