使用Java的计时器任务

时间:2019-02-11 08:24:20

标签: java

我有一个要求,我必须在一定时间内(假设是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);

    }

3 个答案:

答案 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