是否可以为java中的一组指令设置超时?我有以下内容:
new Thread(new Runnable(){
public void run() {
//instructions
for(...){
....
}
//instructions2
}}).start();
我想为循环设置超时,如果它达到时间,则通常使用instructions2继续。在循环内部,我有几个函数调用(一个复杂的组织)并且可以在其中任何一个内部被阻塞,从而导致持续时间较长的循环。
提前致谢。
答案 0 :(得分:2)
假设您的阻止功能响应中断,您可以使用具有超时的未来。如果它们没有,那么你可以做的并不多...请注意,使用下面的方法,你不需要再手动启动线程了。
ExecutorService forLoopExecutor = Executors.newSingleThreadExecutor();
Future<?> future = forLoopExecutor.submit(new Runnable() {
@Override
public void run() {
//your for loop here
}
});
try {
future.get(1, TimeUnit.SECONDS); //your timeout here
} catch (TimeoutException e) {
future.cancel(true);
}
forLoopExecutor.shutdownNow();
//proceed with the rest of your code
forLoopExecutor.submit(aRunnableForInstructions2);
答案 1 :(得分:1)
也许这个例子可以帮助你
long l = System.currentTimeMillis();
final long TIMEOUTMILLIS = 1000;
for(;;){
System.out.println("bla bla bla");
if(System.currentTimeMillis()>l+TIMEOUTMILLIS){
break;
}
}
您可以计算花费的时间并离开循环。
另一种策略是在指定的时间后中断线程。我希望这有帮助
答案 2 :(得分:1)
如果你在for循环中的任何地方捕获InterruptedException
,请删除所有这些try / catch块,而是使用一个try / catch来围绕整个for循环。当你中断它的线程时,这将允许整个for循环停止。
同样,如果您要抓住IOException
,请先抓住InterruptedIOException
和ClosedByInterruptException
。将这些catch块移到for循环之外。 (如果你在内部捕获IOException
,编译器将不允许它,因为在外层没有任何东西可以捕获。)
如果阻止调用没有抛出InterruptedException
,则需要在每个调用之后添加一个检查,如下所示:
if (Thread.interrupted()) {
break;
}
如果你有很多级别的循环,你可能想要添加一个标签 直接退出第一个“指令”循环,无需添加 很多标志变量:
instructions:
for ( ... ) {
for ( ... ) {
doLongOperation();
if (Thread.interrupted()) {
break instructions;
}
}
}
无论哪种方式,一旦处理了中断,你就可以让后台线程中断你的第一个for循环:
final Thread instructionsThread = Thread.currentThread();
Runnable interruptor = new Runnable() {
public void run() {
instructionsThread.interrupt();
}
};
ScheduledExecutorService executor =
Executors.newSingleThreadScheduledExecutor();
executor.schedule(interruptor, 5, TimeUnit.MINUTES);
// instructions
try {
for ( ... ) {
}
} catch (InterruptedException |
InterruptedIOException |
ClosedByInterruptException e) {
logger.log(Level.FINE, "First loop timed out.", e);
} finally {
executor.shutdown();
}
// instructions2