0

次のようなものがあるとします。

while (true) {
  val job = Future { doSomething(); 1 }
  val timeout = Future { Thread.sleep(1000); 2 }

  val both = for (j <- job; t <- timeout) {
    println("Done")
  }
  Await.result(both)
}

rx-java/scala を使用したこの慣用的な解決策は何ですか?

更新: コードから明らかでない場合は、もう少し明確にします。

ts nとten nをそれぞれジョブの開始終了のタイムスタンプとします。doSomething()

次に、次のジョブをts n+1 = max (ten n , ts n + 1 second )にスケジュールする必要があります。

4

2 に答える 2

0

問題を正しく理解している場合は、再帰的なスケジューリングを行う必要があります (ジョブから値を発行していないように見えるため)。RxJava でこれを行う方法の例を次に示しますScheduler.Worker

public class RecurringJob {
    static Subscription runJob(Runnable run) {
        Scheduler.Worker w = Schedulers.newThread().createWorker();
        MultipleAssignmentSubscription mas = new MultipleAssignmentSubscription();
        Action0 action = new Action0() {
            @Override
            public void call() {
                try {
                    run.run();
                    mas.set(w.schedule(this, 1, TimeUnit.SECONDS));
                } catch (Throwable t) {
                    t.printStackTrace();
                    w.unsubscribe();
                }
            }
        };
        mas.set(w.schedule(action, 1, TimeUnit.SECONDS));
        return mas;
    }
    public static void main(String[] args) throws InterruptedException {
        Subscription s = runJob(() -> System.out.println("Job"));
        Thread.sleep(10000);
        s.unsubscribe();
        System.out.println("Job stopped");
        Thread.sleep(3000);
        System.out.println("Done.");
    }
}
于 2015-03-24T07:57:27.503 に答える