java:for循环中的最大执行时间

时间:2017-03-29 18:38:28

标签: java timer limit

我已经得到了以下代码:

    List<String> instances2 = Arrays.asList("instances/umps20.txt","instances/umps22.txt","instances/umps24.txt","instances/umps26.txt","instances/umps28.txt","instances/umps30.txt","instances/umps32.txt");
    List<Integer> qq1 = Arrays.asList(9,10,11,12,13,14,14);
    List<Integer> qq2 = Arrays.asList(4,4,5,5,5,5,6);

    for (int i = 0; i<7; i++) {
        Tournament t = p.process(instances2.get(i));    
        int nTeams = t.getNTeams();
        int q1 = qq1.get(i);
        int q2 = qq2.get(i);
        UndirectedGraph graph = g.create(t, q1, q2);
        new Choco(graph, nTeams);
        }
    }

现在我想对每次迭代施加限制。所以在让我们说3h = 10 800 000ms之后,我希望for循环中的所有东西都停止并开始循环的下一次迭代。有什么想法吗?

提前致谢!

尼古拉斯

3 个答案:

答案 0 :(得分:2)

您可以在开始循环之前获取系统时间,并在每次迭代后比较它以检查时间是否超过指定时间,如下所示:

开启循环:

long start = System.currentTimeMillis();

在每次迭代中:

if(start + 10_800_000 >= System.currentTimeMillis()){
    start = System.currentTimeMillis();
    i++;
}

你必须删除for循环中的i ++

for (int i = 0; i<7;) {

答案 1 :(得分:1)

您必须创建一个将运行循环的新线程,ExecutorService将运行此循环(或您在call()方法中放置的任何代码)指定的时间。

这是一个任务的演示,需要5秒才能运行,它将在3秒后中断:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class QuickTest {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new Task());

        try {
            System.out.println("Started..");    // your task is running
            System.out.println(future.get(3, TimeUnit.SECONDS));    // enter the amount of time you want to allow your code to run
            System.out.println("Finished!");    // the task finished within the given time
        } catch (TimeoutException e) {
            future.cancel(true);
            System.out.println("Terminated!");  // the task took too long and was interrupted
        }

        executor.shutdownNow();
    }
}

class Task implements Callable<String> {    
    @Override
    public String call() throws Exception {  // enter the code you want to run for x time in here
        Thread.sleep(5000); // Just to demo some code which takes 5 seconds to finish.
        return "Ready!";    // code finished and was not interrupted (you gave it enough time).
    }
}

答案 2 :(得分:0)

有许多方法可以实现所请求的功能。

一种方法可能是将for中的代码转换为FutureTask对象并将其提交给ExecutorService - 即使只有一个线程,如果必须执行循环按顺序 - 例如

ExecutorService executor = Executors.newFixedThreadPool(1);

使用FutureTask(或实现Future接口的任何其他对象)的好处是cancel()方法可用于确保中断的迭代不会创建任何副作用。

对于中断,有很多选择。例如,可以使用javax.swing.Timer类,它会在计时器到期后触发ActionEvent通知。

在上述方法中,任务(for循环代码)将被执行直到完成,或者直到从计时器接收到ActionEvent。在后一种情况下,可以使用对cancel()的调用来停止正在运行的任务,并开始下一个任务。迭代总数的计数器可以保持在同一个地方。

对于更复杂的解决方案,可以使用ExecutorService和超时规范选项的各种实现,就像在另一个StackOverflow question中一样。