持续时间

时间:2015-08-28 16:55:02

标签: java

我正在试图找出退出方法调用的方法,如果它需要更多然后说2秒 在其方法的主体中执行所有操作。例如,我有一个巨大的字符串列表和 想要遍历列表,但只能在2秒内迭代尽可能多的字符串。 假设我在列表中有9,000个对象,但只能在2秒内迭代6,500个方法 应该在2秒后停止。这甚至可以实现吗?我搜索并找到了如何停止线程和计时器(如何在一定时间后启动方法)但没有关于如何在一段时间后退出方法的事情。

public ArrayList<String> removeWords(){

   //Want some sort of timer here that stops method body after 2 seconds

   for(String current: words){

            words.remove(current);
   }
}

public static void main(String [] args){
        ArrayList<String> wordList = removeWords();
        System.out.println("Number of words in list "+ wordList.size());
}

2 个答案:

答案 0 :(得分:3)

即使使用Thread.interrupt()中断线程,也需要定期检查是否已请求中断(使用Thread.interrupted()$http.post('/analytics/generateToken', {}).then( function (result) { console.log("Success"); }, ).catch( function(error) { console.log("error"); } ); ),然后决定如何处理。

所以一个好的一般模式是:

  1. 在处理方法的参数中接受超时(通常的模式为Thread.isInterrupted()
  2. 定期(循环的每次 n 次迭代,甚至每次迭代,如果它不会影响您的性能)检查超时和中断(使用System.currentTimeMillis()和{ {3}}进行比较)。
  3. 如果发生任何一次,则返回
  4. 如果超时,您返回的内容取决于您,但是如果中断,您可以抛出TimeUnit.toMillis()

    当然,如果您不打算在单独的帖子中启动您的方法,那么您不必担心中断检查 - 只是超时。

答案 1 :(得分:3)

前提:在对集合进行迭代时,要删除元素,必须使用相同的迭代器,否则会出现异常

Iterator<String> it = words.iterator();
while (it.hasNext()) {
  String word = it.next();
  if (shouldRemove(word))
    it.remove();
}

如果要停止的程序是循环并且单次迭代不包含任何可以阻止的程序,则可以简单地计算结束时刻并在X次迭代后进行检查:

for (String word : words) {
  if (System.currentTimeMillis() > endInstant) {
    timedOut = true; // better store this
    break;
  // ...
}

否则通常(且更强大)的方法是将程序包装在Callable<E>中并使用单独的线程:

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Result> promise = executor.submit(callable);
Result result = promise.get(10, TimeUnits.SECOND);

这样,如果结果在允许的时间内没有准备好,监视器将获得异常。

作为最后一点,请考虑包装的任务仍在运行并占用资源,因此您可能希望从主线程中将shouldStop标志设置为true以尽早停止计算尽可能。