gpt4 book ai didi

Java函数在时间过去后结束

转载 作者:行者123 更新时间:2023-12-01 14:08:47 25 4
gpt4 key购买 nike

这就是我想要做的。给定一个函数

public void foo() {

}

我希望在经过一定时间后结束它。也就是说,假设这是某种随机生成器,它必须生成满足一些困难约束的随机对象,因此在给定的时间分配下它可能会成功,也可能不会成功。也就是说,函数实际上可能是这样的

public void foo() {
//task1
while(fails) {
//...
}

//task2
while(fails2) {
//...
}

//more tasks may follow, which use the data from the previous tasks to further try to satisfy difficult conditions
}

这只是一个例子。但关键是该函数包含许多 while 循环、许多测试用例和大量繁重的计算。

目标:我希望能够说“运行 foo(),如果 4 秒后 foo() 仍未完成,则立即停止 foo()。”

我尝试过的:我尝试在 foo() 的几乎每一行都包含条件,以查看已经过去了多少时间,如果 4 秒过去了,则返回函数.但是考虑到 foo() 的复杂程度,这显然很难在代码方面进行,因为这需要在函数的每一行上测试时间。

我的思考逻辑:我认为这应该是可能的,因为有一些函数可以做这种事情,无论状态如何都会终止代码,例如 System.exit(1)。这就是想法。我希望能够从外部调用,让这个函数 foo() 终止。

最佳答案

// foo method and global variables used
private static ArrayList<Integer> foo() {
// info class
class Info {
public boolean run, completed;
public ArrayList<Integer> list;
}
// declare info object, list
final Info info = new Info();
final Object wait = new Object();
// run a new thread
Thread t = new Thread(
new Runnable() {
// run method
@Override
public void run() {
// setup run
info.run = true;
info.completed = false;
info.list = new ArrayList<>();
// loop to modify list. Don't put a big piece of code that will
// take a long time to execute in here.
while(info.run) {
// example of what you should be doing in here:
info.list.add(1);
// and if you are done modifying the list, use:
break;
}
// done modifying list
info.completed = true;
synchronized(wait) {
wait.notify();
}
}
}
);
t.start();
// wait for four seconds, then return list
try {
synchronized(wait) {
wait.wait(4000);
}
} catch (InterruptedException e) { e.printStackTrace(); }
info.run = false;
return info.completed ? info.list : null;
}
// main method
public static void main(String[] args) {
// get list
ArrayList<Integer> list = foo();
System.out.println("Done!");
}

foo() 方法的作用是什么?

  1. 开始修改最终会返回的列表
  2. 如果修改此列表的时间超过四秒,它将停止修改列表并返回列表。
  3. 如果列表提前停止,它将返回 null。
  4. 它现在只使用局部变量!
  5. 不错的奖励,第二次修改它会立即返回列表。

关于Java函数在时间过去后结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14300054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com