我已经得到了以下代码:
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循环中的所有东西都停止并开始循环的下一次迭代。有什么想法吗?
提前致谢!
尼古拉斯
答案 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中一样。