【问题标题】:Limiting execution time in Java without threading在没有线程的情况下限制 Java 中的执行时间
【发布时间】:2014-05-14 09:14:54
【问题描述】:

(请不要将此重复标记为我的 previous question,它们不是 - 我正在寻找 单线程 解决方案)。

我需要一种简单的方法来限制 java 中某些方法的执行时间。

理想情况下我认为可以做些什么:

  1. 我调用了一个函数或方法
  2. 如果给定的时间过去了而没有返回,
  3. 出现异常。

但任何其他解决方案都可以。为了我。我需要的是几乎等同于 unix 上的 alarm() libc 调用。有可能吗?

我需要一个单线程解决方案。多线程解决方案很简单。

【问题讨论】:

  • 你运气不好。仅当您手动轮询是否发生超时时才有可能,并且只有当您的任务被划分为足够小的步骤时才有可能。多线程解决方案有什么问题,即您实际上是否有要解决的问题,或者您只是在问“我们可以这样做吗?”问题?
  • @Kayaman 线程由这里的外部实体处理,它对我的​​意图一无所知。
  • 最好还是提出实际问题,而不是尝试解决问题。否则你可能会得到一个愚蠢的解决方案来优雅地解决问题。
  • @Kayaman 我们对“优雅的解决方案”的看法不同。对我来说,如果我只需要一个超时的异常,抛出警报异常是优雅的,而不是像创建新线程那样难的男孩。我最不想就应该使用线程进行毫无意义的辩论。
  • 但是 Java 没有这些。所以你优雅的解决方案不是解决方案,而是一种幻觉。

标签: java timeout


【解决方案1】:

在java中,一切都在一个线程中运行。为了检查某个线程是否被击中,您需要从“另一个”线程监视它。要么你需要使用TimerTask 生成新线程,要么你需要一些API 方法,比如ScheduledExecutorService

所以恕我直言,很难在没有多线程的情况下提供优雅的解决方案。

可能会有一些黑客攻击,就像我在下面展示的那样。但它们在实际场景中既不优雅也不推荐。

    public static void main(String[] args) {
        long startMilli = System.currentTimeMillis();

        for(int i=0;;i++) {
            //Do something
            long timepassed = System.currentTimeMillis() -startMilli;
            if(timepassed==1000) {
                throw new RuntimeException("taking too long");
            }
        }

    }

【讨论】:

  • 我明确表示我正在寻找解决方案,而无需打开新线程。仅当您可以将代码执行组织为处理循环中的回调时,您的建议才有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 2021-09-06
相关资源
最近更新 更多