programing

TimerTask 대 Thread.sleep 대 핸들러 postDelayed-N 밀리 초마다 함수를 호출하는 것이 가장 정확합니까?

sourcetip 2021. 1. 15. 20:24
반응형

TimerTask 대 Thread.sleep 대 핸들러 postDelayed-N 밀리 초마다 함수를 호출하는 것이 가장 정확합니까?


N 밀리 초마다 함수를 호출하는 가장 정확한 방법은 무엇입니까?

  • Thread.sleep으로 스레드
  • TimerTask
  • postDelayed가있는 핸들러

Thread.sleep을 사용 하여이 예제수정 했는데 그다지 정확하지 않습니다.

주어진 BPM에서 소리를 재생하는 음악 앱을 개발 중입니다. 나는 완전히 정확한 메트로놈을 만드는 것이 불가능하다는 것을 이해하고, 그럴 필요가 없습니다. 단지 이것을하기위한 최선의 방법을 찾고 있습니다.

감사


타이머 사용에는 몇 가지 단점이 있습니다.

  • 작업을 실행하기 위해 단일 스레드 만 생성하고 작업을 실행하는 데 너무 오래 걸리면 다른 작업이 어려움을 겪습니다.
  • 작업에서 발생한 예외를 처리하지 않고 스레드가 종료되어 다른 예약 된 작업에 영향을 미치며 실행되지 않습니다.

ScheduledThreadPoolExecutor는 이러한 모든 문제를 적절하게 처리하며 Timer를 사용하는 것은 이치에 맞지 않습니다. 귀하의 경우에 사용할 수있는 두 가지 방법이 있습니다 .. scheduleAtFixedRate (...) 및 scheduleWithFixedDelay (..)

class MyTask implements Runnable {

  @Override
  public void run() {
    System.out.println("Hello world");
  } 
}

ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
long period = 100; // the period between successive executions
exec.scheduleAtFixedRate(new MyTask(), 0, period, TimeUnit.MICROSECONDS);
long delay = 100; //the delay between the termination of one execution and the commencement of the next
exec.scheduleWithFixedDelay(new MyTask(), 0, delay, TimeUnit.MICROSECONDS);

Android에서는 자체 핸들러 / 메시지 큐를 사용하여 스레드를 만들 수 있습니다. 꽤 정확합니다. Handler 문서 를 보면 그것을 위해 설계되었음을 알 수 있습니다.

핸들러에는 두 가지 주요 용도가 있습니다. (1) 메시지와 실행 파일을 미래의 특정 시점으로 실행하도록 예약합니다. (2) 자신의 스레드가 아닌 다른 스레드에서 수행 할 작업을 대기열에 추가합니다.


그것들은 모두 동일한 정밀도입니다. Java 타이밍 정밀도는 시스템 타이머 및 스케줄러의 정밀도와 정확성에 따라 다르며 보장되지 않습니다. Thread.sleep 및 Object.wait API를 참조하세요.


루프 작업에 TimerTask를 사용하는 것이 더 좋습니다. 권하다

참조 URL : https://stackoverflow.com/questions/18605403/timertask-vs-thread-sleep-vs-handler-postdelayed-most-accurate-to-call-functio

반응형