首页 文章

如何在Java中停止不间断的工作

提问于
浏览
0

目前,我使用SDK上传图片 . 但是,upload方法没有提供超时选项 . 因此我需要手动设置超时 . 一种选择是:

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

1 回答

  • 0

    ...可能不会工作......

    是一种相当低效的推理方式 . 为什么不试试呢?它可能会工作!!

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

    如果你这样做,那么唯一的答案是线程对于可取消和长时间运行的活动来说是不合适的选择 . 如果你准备付出代价,你可以选择分出一个单独的过程 - 可以确定地杀死它 . 转到 ProcessBuilder 并在不同的jar中创建upliad代码 . http上传仍然无法保证死亡 .

相关问题