我有一个要求,我必须在一定时间内(假设是50秒,时间可能是动态的)从服务器中获取一些数据。 每隔10秒(在这30秒之间),同时,我必须向服务器发送一些密钥。
使用下面的代码针对该iam...。但它不起作用
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
long duration = (50 * 1000);
do {
// RESEt request call code goes here..
/////
//////
System.out.println("Rest request");
java.util.Timer t = new java.util.Timer();
java.util.TimerTask task = new java.util.TimerTask() {
@Override
public void run() {
//Sending key every 10 sec
RemoteKey.send(PageUp);
}
};
t.schedule(task, 0, (10 * 1000));
// This do while loop will execute 50 sec
} while ((System.currentTimeMillis() - startTime) < duration);
}
答案 0 :(得分:1)
为什么不安排一次并自行取消?
long duration=whatever;
java.util.Timer timer = new java.util.Timer();
java.util.TimerTask task = new java.util.TimerTask() {
long t0=System.currentTimeMilis(); // or set it upon scheduling;
@Override
public void run() {
//this will stop the task from executing in future.
if((System.currentTimeMillis() - t0) >= duration) { this.cancel(); return;}
// do actual work
RemoteKey.send(PageUp);
}
};
timer.scheduleAtFixedRate(task,initialDelay,delayBetweenActions);
更现代的方法是使用ScheduledExecutorService
。
答案 1 :(得分:1)
我认为您应该使用RxJava和Job Scheduler在特定的时间间隔安排任务。
例如:
Observable.interval(50, TimeUnit.SECONDS)
.doOnNext(n -> performYourtask())
.subscribe();
答案 2 :(得分:1)
使用现代的[[{id: 1,content: 'test@random.com'},{id: 2,content: 'Idle'}],
[{id: 1,content: 'whatever@random.com'},{id: 2,content: 'Busy'}]]
,这将是最佳方法
由于 fetching 操作决定了50秒的时间间隔,并且该操作是同步的,因此您只需要等待它结束即可。
ScheduledExecutor
// Start the executor, scheduling your Runnable Task to run every 10 seconds
executorService.scheduleAtFixedRate(
() -> {
// Send your data
}, 0, 10, TimeUnit.SECONDS);
// Fetch data from your Server.
// That's a blocking operation, which, let's say will take 50 seconds
// Stop the Executor as the time is over
executorService.shutdown();
可以通过Factory方法创建。
Executor