>

지속 시간 (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);
    }


  • 답변 # 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 를 사용하는 것입니다

  • 답변 # 2

    RxJava와 Job Scheduler를 사용하여 특정 간격으로 작업을 예약해야한다고 생각합니다.

    예 :

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

  • 답변 # 3

    현대적인 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"

  • 이전 reactjs - 반응 테이블 페이지 매김
  • 다음 python - Flask에서 PHP 파일로 리디렉션