我需要创建一个只运行30分钟的java函数,并在30分钟结束时执行某些操作。但如果符合正确的条件,它也应该能够在给定时间之前自行终止。我不希望函数休眠,因为它应该收集数据,所以没有睡眠线程。
由于
答案 0 :(得分:5)
使用:Timer.schedule( TimerTask, long )
public void someFunctino() {
// set the timeout
// this will stop this function in 30 minutes
long in30Minutes = 30 * 60 * 1000;
Timer timer = new Timer();
timer.schedule( new TimerTask(){
public void run() {
if( conditionsAreMet() ) {
System.exit(0);
}
}
}, in30Minutes );
// do the work...
.... work for n time, it would be stoped in 30 minutes at most
... code code code
}
答案 1 :(得分:1)
获取System.currentTimeMillis()
的开始时间,计算停止的时间,并在收集要收集的数据时不时检查当前时间。另一种方法是将计时器和数据收集分离,以便它们中的每一个都可以在自己的线程中运行。
要获得更具体的答案,如果您要告诉您正在收集的数据以及 收集数据
,将会很有帮助。答案 2 :(得分:1)
这样的事情会起作用:
long startTime = System.currentTimeMillis();
long maxDurationInMilliseconds = 30 * 60 * 1000;
while (System.currentTimeMillis() < startTime + maxDurationInMilliseconds) {
// carry on running - 30 minutes hasn't elapsed yet
if (someOtherConditionIsMet) {
// stop running early
break;
}
}
答案 3 :(得分:1)
现代java.util.concurrent
方式将使用ExecutorService
。有几种invoke
方法暂停。
这是一个启动示例:
public static void main(String args[]) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.invokeAll(Arrays.asList(new Task()), 30, TimeUnit.MINUTES);
executor.shutdown();
}
其中Task
如下所示:
public class Task implements Callable<String> {
@Override
public String call() {
// Just a dummy long running task.
BigInteger i = new BigInteger("0");
for (long l = 0; l < Long.MAX_VALUE; l++) {
i.multiply(new BigInteger(String.valueOf(l)));
// You need to check this regularly..
if (Thread.interrupted()) {
System.out.println("Task interrupted!");
break; // ..and stop the task whenever Thread is interrupted.
}
}
return null; // Or whatever you'd like to use as return value.
}
}