我有一个方法:
public class Datasource {
public void create() throws MyException{
// can take more time than expected
}
}
我想为此方法添加超时。
我试过了:
public class Test {
public static void main(String[] args) throws MyException {
runWithTimeout(new Datasource());
}
public static void runWithTimeout(final Datasource ds) throws MyException {
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable<Object> task = new Callable<Object>() {
public Object call() throws MyException {
ds.create();
return null;
}
};
Future<Object> future = executor.submit(task);
try {
future.get(5, TimeUnit.SECONDS);
} catch (TimeoutException tex) {
throw new MyException("TimeoutException. Caused By", tex);
} catch (InterruptedException iex) {
throw new MyException("InterruptedException. Caused By", iex);
} catch (ExecutionException eex) {
throw new MyException("InterruptedException. Caused By", eex);
} finally {
future.cancel(true);
executor.shutdown();
}
}
}
但是create方法仍在运行。我该如何强行阻止它。
我无法修改create()
方法。所以我无法在isInterrupted()
方法中的当前线程上添加create()
。
答案 0 :(得分:0)
Future.cancel
电话不会终止正在进行的流程。它更像是对未来任务的暗示,这个被取消了。除此之外,没有保证从第三方库中停止Thread
的方法。您唯一希望的是迭代ThreadGroup
并在其上调用interrupt()
,然后希望正在进行的Thread
处理{{1}并取消自己。