我正在试图找出退出方法调用的方法,如果它需要更多然后说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());
}
答案 0 :(得分:3)
即使使用Thread.interrupt()
中断线程,也需要定期检查是否已请求中断(使用Thread.interrupted()
或$http.post('/analytics/generateToken', {}).then(
function (result) {
console.log("Success");
},
).catch(
function(error) {
console.log("error");
}
);
),然后决定如何处理。
所以一个好的一般模式是:
Thread.isInterrupted()
)System.currentTimeMillis()
和{ {3}}进行比较)。如果超时,您返回的内容取决于您,但是如果中断,您可以抛出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
以尽早停止计算尽可能。