[英]How to timeout a java thread from main Thread?
我刚开始使用 java 中的 ExecutorService、Future 和 Runnable 来设置线程超时。 我正在开发一个程序,我的主线程将调用另一个线程来解析 XML 文件,并且(出于安全目的)在一定时间后超时。 我已经谷歌搜索了几个小时并阅读了许多 StackOverFlow 线程,但我似乎根本无法让主线程中断辅助线程。 当我运行这个程序时,xml 解析器将 go 永远解析大得离谱的文件,我似乎无法让它被中断。 任何帮助将不胜感激。 我的两个线程的代码如下。
public class xmlParser{
private static class Parse implements Runnable {
private final String xmlFile;
public Parse(String xmlFile) {
this.xmlFile = xmlFile;
}
@Override
public void run() {
try {
while (!Thread.interrupted()) {
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.setContentHandler(new MyContentHandler());
xmlReader.parse(new InputSource(xmlFile));
}
}
catch (Exception e) {
System.err.println("TIMEOUT ERROR: Took too long to parse xml file.");
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future future = executor.submit(new Parse(args[0]));
try {
future.get(1, TimeUnit.SECONDS);
}
catch (Exception e) {
future.cancel(true);
}
finally {
executor.shutdownNow();
}
}
}
注意:我知道 future.get(long timeout, TimeUnit unit) 会抛出多种类型的异常,稍后会处理。 目前,我只希望我的主线程在运行 1 秒后中断 Parse 线程。
我试图用一个更简单的工作来重现:
static class FiveSecJob implements Callable<String> {
@Override
public String call() {
long t0 = System.currentTimeMillis();
try {
Thread.sleep(5000);
return "success";
} catch (Exception e) {
System.out.println("interrupted after " + (System.currentTimeMillis() - t0) / 1000d + "s: " + e);
return e.getMessage();
}
}
}
@Test
public void testTimeout() {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(new FiveSecJob());
String s = "initial value";
try {
s = future.get(1, TimeUnit.SECONDS);
} catch (Exception e) {
System.out.println("cancelling future (" + e + ")");
future.cancel(true);
} finally {
executor.shutdownNow();
}
System.out.println("s: " + s);
}
它似乎像intendend一样取消了工作。 output 是:
cancelling future (java.util.concurrent.TimeoutException)
s: initial value
interrupted after 1.0s: java.lang.InterruptedException: sleep interrupted
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.