当前,我使用SDK上传图片。但是,上载方法未提供超时选项。因此,我需要手动设置超时。一种选择是:
public static String uploadImg(String imgStream) {
final ExecutorService executor = Executors.newSingleThreadExecutor();
final Future<String> future = executor.submit(new uploadableTask(imgStream));
try {
final String res = future.get(500, TimeUnit.SECONDS);
return res;
} catch (final TimeoutException e) {
future.cancel(true);
executor.shutdownNow();
return null;
} catch (final InterruptedException e) {
return null;
} catch (final ExecutionException e) {
return null;
}
}
但是,future.cancel(true);可能无法正常工作。它取决于uploadableTask类中SDK的上载方法的实现(例如,如果不检查中断标志,则上载方法无法停止)。有人知道其他解决方案吗?
答案 0 :(得分:0)
... 可能无法正常工作 ...
是一种相当无效的推理方式。为什么不只是测试呢?可能可行!
但是是的,我也相信这可能行不通。在这种情况下,您真的需要取消它吗?无论如何,这是一个上传过程。它有什么危害™?还要记住,即使java内部的一切都正常,您仍然没有确定性的方式来取消上载本身。由于HTTP和一般网络的本质,(假设它是http上传),一旦数据离开jvm,就没有确定性的取消方法-它的运行速度非常快。 Jvm只是在等待收据的确认,而不是实际的传输。那么,您真的需要取消它吗?
如果您这样做,那么唯一的答案就是线程对于可取消且运行时间较长的活动是不合适的选择。如果您准备付出代价,则可以选择分担一个单独的过程-确定性地终止该过程。选择ProcessBuilder
,然后在另一个jar中切出upliad代码。仍然不保证http上传会死掉。