0

目前,我使用 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 上传方法的实现(例如,如果不检查中断标志,则上传方法不能停止)。有人知道其他解决方案吗?

4

1 回答 1

0

...可能行不通...

是一种相当低效的推理方式。为什么不直接测试呢?它可能会起作用!

但是,是的,我也相信它可能行不通。在那种情况下,问题是你真的需要取消它吗?无论如何,这是一个上传过程。它有什么危害™?还要记住,即使 java 中的一切工作正常,你仍然没有确定的方法来取消上传本身。由于 http 和一般网络的本质,(假设它是 http 上传)一旦数据离开 jvm,就没有确定的方法来取消 - 它的速度非常快。Jvm 只是等待确认接收,而不是实际传输。那么,你真的需要取消它吗?

如果您这样做,那么唯一的答案是线程不适合可取消且运行时间较长的活动。如果你准备好付出代价,你可以选择分叉一个单独的进程——它可以被确定性地杀死。在另一个 jar 中寻找ProcessBuilder并雕刻 upliad 代码。一个http上传仍然不能保证死。

于 2018-12-09T06:02:26.623 回答