Java에서 타이머를 설정하는 방법은 무엇입니까?


151

2 분 동안 타이머를 설정하여 데이터베이스에 연결하려고 시도한 다음 연결에 문제가있는 경우 예외를 throw하는 방법은 무엇입니까?


1
그들은 적어도 이분에 대한 작업을 시도 간단한하고자하는 경우 Coul 영업 이익이 명확하게 예외가, 지금은 나중에 2 분 던져해야하는 경우, 또는 연결 시도가 진행중인 현재 경우에도
thecoshman

답변:


280

답의 첫 번째 부분은 처음에 그것을 해석 한 방법이었고 몇몇 사람들이 도움이되는 것처럼 보였으므로 주제가 요구하는 것을 수행하는 방법입니다. 질문은 명확 해졌고 그 문제를 해결하기 위해 답변을 확장했습니다.

타이머 설정

먼저 타이머를 만들어야합니다 ( java.util여기서는 버전을 사용하고 있습니다).

import java.util.Timer;

..

Timer timer = new Timer();

일단 작업을 실행하려면 다음을 수행하십시오.

timer.schedule(new TimerTask() {
  @Override
  public void run() {
    // Your database code here
  }
}, 2*60*1000);
// Since Java-8
timer.schedule(() -> /* your database code here */, 2*60*1000);

지속 시간 후에 작업을 반복하려면 다음을 수행하십시오.

timer.scheduleAtFixedRate(new TimerTask() {
  @Override
  public void run() {
    // Your database code here
  }
}, 2*60*1000, 2*60*1000);

// Since Java-8
timer.scheduleAtFixedRate(() -> /* your database code here */, 2*60*1000, 2*60*1000);

작업 시간 초과 만들기

명확한 질문이 요구하는 것을 구체적으로 수행하기 위해, 주어진 기간 동안 작업을 수행하려고 시도하면 다음을 수행 할 수 있습니다.

ExecutorService service = Executors.newSingleThreadExecutor();

try {
    Runnable r = new Runnable() {
        @Override
        public void run() {
            // Database task
        }
    };

    Future<?> f = service.submit(r);

    f.get(2, TimeUnit.MINUTES);     // attempt the task for two minutes
}
catch (final InterruptedException e) {
    // The thread was interrupted during sleep, wait or join
}
catch (final TimeoutException e) {
    // Took too long!
}
catch (final ExecutionException e) {
    // An exception from within the Runnable task
}
finally {
    service.shutdown();
}

작업이 2 분 이내에 완료되면 예외와 함께 정상적으로 실행됩니다. 그보다 오래 실행되면 TimeoutException이 발생합니다.

한 가지 문제는 2 분 후에도 TimeoutException이 발생 하더라도 데이터베이스 또는 네트워크 연결이 결국 시간 초과되고 스레드에서 예외가 발생하더라도 작업이 실제로 계속 실행 된다는 것입니다. 그러나 그렇게 될 때까지 리소스를 소비 할 수 있습니다.


오, 문제가 잘못되었다고 생각합니다. 매번 2 분마다 데이터베이스에 연결하려고 반복적으로 시도해야합니다.
Ankita

미안하지만 내 요구 사항은 내가 데이터베이스에 연결하는 2 분주고 싶어 내가 데이터베이스에 연결을 시도하는 시간 제한을 설정하려는처럼 다음 그냥 message.It이 일부 오류가 발생합니다
Ankita

7
주의 사항 :이 답변은 끔찍하게 잘못되었습니다. 타이머는 2 분 동안 대기 한 다음 2 분 지연된 후에 DB 쿼리를 실행 한 다음 2 분마다 반복해서 실행합니다. 그것이하지 않는 것은 DB 쿼리를 즉시 실행 한 다음 2 분 후에 실패한다는 것입니다.
AgilePro 2013

2
@AgilePro 맞습니다. 궁극적으로 언급 된대로 질문에 대답하지 않았으며 이제는 그것을 해결하기 위해 업데이트했습니다.
andrewmu

1
@ErnestasGruodis 핵심 API는 생성자를 public으로 나열합니다. docs.oracle.com/javase/7/docs/api/java/util/Timer.html#Timer () 클래스 경로에 다른 타이머 클래스가있을 수 있습니다. java를 시도하십시오. 클래스로서의 util.Timer
andrewmu

25

이것을 사용하십시오

long startTime = System.currentTimeMillis();
long elapsedTime = 0L.

while (elapsedTime < 2*60*1000) {
    //perform db poll/check
    elapsedTime = (new Date()).getTime() - startTime;
}

//Throw your exception

1
흠 ... 이것은 기술적으로 효과가있을 것입니다. 최첨단 사례는 다루지 않습니다. DB 폴링을 수행 할 때 시간이 부족한 경우 OP에 의해 필요할 수 있습니다
thecoshman

1
이것이 유일한 정답입니다. 단일 스레드에서 실행되며 드리프트없이 종료 시간을 계산합니다. 이 경우에는 TimerTask를 사용하는 것이 잘못되었습니다. StackOverflow의 예제 가이 같은 종류의 잘못된 것을 제안하는 것에 놀랐습니다.
AgilePro

1
@thecoshman-타이머 구현은 DB 작업이 진행된 후에도 중단되지 않습니다. 어쨌든 DB 작업을 시작하는 시간 만 제어 할 수 있습니다. 시간을 맞추기 위해 "타이머"가 필요하다는 일반적인 오해가 있지만 그렇지는 않습니다. 당신은 무언가를하기 만하면되고, 현재 시간을 사용함으로써 너무 오래하지 마십시오.
AgilePro

연결을 반환하거나 정확히 2 분 후에 처리해야한다고 가정 해 보겠습니다. 연결 시도 후 2 분이 지나도 여전히 연결에 실패한 경우입니다. 연결 확인에 2 주가 걸리는 상황에서는 예외를 처리하는 데 시간이 오래 걸립니다.
thecoshman

14
while 루프는 지속적으로 실행되고 물건을 검사하기 때문에 실제로는 매우 나쁜 코딩 스타일입니다 .CPU에는 좋지 않으며 배터리 수명에는 좋지 않습니다.
무한

11

좋아, 나는 지금 당신의 문제를 이해한다고 생각합니다. 미래를 사용하여 무언가를 시도한 후 아무 일도 일어나지 않으면 시간이 초과되면 시간 초과 될 수 있습니다.

예 :

FutureTask<Void> task = new FutureTask<Void>(new Callable<Void>() {
  @Override
  public Void call() throws Exception {
    // Do DB stuff
    return null;
  }
});

Executor executor = Executors.newSingleThreadScheduledExecutor();
executor.execute(task);

try {
  task.get(5, TimeUnit.SECONDS);
}
catch(Exception ex) {
  // Handle your exception
}

예외가 발생하지만 프로그램이 종료되지 않습니다.이를 통해 도와주세요.
Ankita

2
Executor 대신 ExecutorService 클래스를 사용할 수 있습니다. 실행 프로그램을 중지하는 shutdown () 메소드가 있습니다.
Rite

1
집행자는 Callable / Runnable에서 특별히 처리하지 않은 예외를 삼킨다. Runnable / Callable이 예외 자체를 포착하고 처리하지 않고 예외를 소유하고 제공하는 경우 ScheduledExecutorService를 서브 클래 싱하고 afterExecute를 재정의해야합니다 (super.afterExecute ()를 호출하십시오). afterExecute에 대한 두 번째 주장은 Runnable / Callable에서 던질 수 있습니다
adam

3
    new java.util.Timer().schedule(new TimerTask(){
        @Override
        public void run() {
            System.out.println("Executed...");
           //your code here 
           //1000*5=5000 mlsec. i.e. 5 seconds. u can change accordngly 
        }
    },1000*5,1000*5); 

코드 위의 해충을 복사하면 정상적으로 작동합니다. 나는이 코드를 처음으로 실행하기 위해 두 번째로 '시간'을 두 번 주었고 두 번째는 간격 시간입니다.
Mahadev Mane

Timer 설명서는 대신 Executor 프레임 워크를 사용할 것을 권장합니다. docs.oracle.com/javase/10/docs/api/java/util/Timer.html
Karan Khanna

1

[Android] 누군가 java를 사용하여 android에서 타이머 를 구현하려는 경우 .

작업을 수행하려면 이와 같은 UI 스레드를 사용해야 합니다.

Timer timer = new Timer();
timer.schedule(new TimerTask() {
           @Override
            public void run() {
                ActivityName.this.runOnUiThread(new Runnable(){
                    @Override
                      public void run() {
                       // do something
                      }        
                });
            }
        }, 2000));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.