有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

持续时间后的java退出方法

我正在试图找出一种方法,如果需要超过2秒的时间,就可以退出方法调用 执行其方法体中的所有内容。例如,我有一个巨大的字符串列表和 希望迭代列表,但仅在2秒内迭代尽可能多的字符串。 假设列表中有9000个对象,但只能在2秒内迭代6500个对象 应该在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) 个答案

  1. # 1 楼答案

    即使使用^{}中断线程,也需要定期检查是否请求了中断(使用^{}Thread.isInterrupted()),然后决定如何处理

    因此,一个好的一般模式是:

    1. 在处理方法的参数中接受超时(通常的模式是^{
    2. 定期检查超时和中断(使用^{}^{}进行比较)
    3. 如果出现任何一种情况,请返回

    如果超时,返回什么取决于您,但是如果中断,您可以抛出一个^{}

    当然,如果你不打算在一个单独的线程中启动你的方法,那么你不需要担心中断检查——只需要超时

  2. # 2 楼答案

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

    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;
      // ...
    }
    

    {cd1}在程序中使用^和^更健壮的方法

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

    这样,如果结果在允许的时间内没有准备好,监视器就会出现异常

    作为最后一点,请考虑包装的任务仍在运行和占用资源,因此您可能希望从主线程设置一个^ {< CD2>}标志到^ {CD3>},以便尽早停止计算。p>