为了账号安全,请及时绑定邮箱和手机立即绑定

使用java的定时器任务

使用java的定时器任务

子衿沉夜 2022-06-15 15:32:31
我有一个要求,在一段时间内(假设是 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 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

我认为您应该使用 RxJava 和 Job Scheduler 以特定时间间隔安排任务。

例如:

Observable.interval(50, TimeUnit.SECONDS)
                    .doOnNext(n -> performYourtask())
                    .subscribe();


查看完整回答
反对 回复 2022-06-15
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

为什么不安排一次,然后自行取消?


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.


查看完整回答
反对 回复 2022-06-15
?
喵喔喔

TA贡献1735条经验 获得超5个赞

这将是最佳方法,使用现代ScheduledExecutor

因为时间跨度,比如 50 秒,由获取操作决定,并且该操作是同步的,您只需要等待它结束。


// 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();

Executor可以通过工厂方法创建。


Executors.newScheduledThreadPool(5);          // For multiple, concurrent threads

Executors.newSingleThreadScheduledExecutor(); // For a synchronous "queue"


查看完整回答
反对 回复 2022-06-15
  • 3 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信