如何在 Java 中停止不间断作业

How to stop uninterruptible job in Java

目前我使用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(真);可能行不通。取决于SDK在uploadableTask中上传方法的实现class(ex.如果不检查中断标志,上传方法不能停止)。有人知道其他解决方案吗?

... probably will not work ...

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

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

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