2016-07-29 3 views
3

매일 오전 1시에 특정 타이밍에 Java 코드를 트리거하려고합니다. while loop가 실행 유지하려면, 그것은 컴퓨터를 느리게, 또는 처리 자원을 먹는 것,'while 루프'가 무한한 리소스를 소모합니다.

while (true) { 
    if (currentTime = 1AM) { 
     doSomething; 
    }  
} 

나는 조금 걱정입니다 :

나는 다음과 같이 스레드를 쓰기?

첫 번째 질문은 초당 1 회만 반복하면 더 좋을까요? 이 경우 내 두 번째 질문은

while (true) { 
    if (currentTime = 1AM) { 
     doSomething; 
    }  

    Thread.sleep(1000); 
} 

, 나는 우리가 다음과 같은 while loop를 작성하는 경우 자바 잠금을 획득하기 위해 대부분의 시간, 사람이 얼마나 비싼 설명 할 수 while loop 아래와 같이 작성 볼 시간 (죄송합니다 매우 기본적인 질문입니까?)

while (isLock) { 
    // do nothing 
} 

doThisIfNoLock(); 

나는 내부 실제로 스레드에 의해 먹고, 얼마나 많은 자원 (처리 능력)을 나는 빈 스레드를 만들 경우, 위의 생각을 확장하고, 무한 빈 while loop? 내 상상력에 따라 루프 내부에 내용이 없으므로 루프가 매우 빠르게 실행되어 많은주기의 CPU 전력을 소비하게됩니다. 그게 사실이야?

+0

이러한 작업을 수행 할 스케줄러가 있습니다. Quartz Scheduler를 살펴보십시오. Spring을 사용하는 경우, 그러한 일을 스케줄 할 수 있습니다. 당신의 접근 방식은 나쁘다 – TheLostMind

+0

'java.util.Timer'도 당신이 시도하는 것보다 낫다. –

+0

루프 동안 무한한 실행할 수 없습니다. 그것은 리소스를 빨아 들이고 처리 속도를 느리게합니다. 대신 스케줄러를 사용하십시오. – Rish

답변

4

CPU를 먹어 치울 수 있기 때문에 무한 루프를 실행하는 것은 좋지 않습니다.

은 예약 된 작업을 위해 당신은 석영과 같은 두 라이브러리를 사용하거나 java.util.Timerjava.util.TimerTask

당신의 작업은 TimerTask에서 상속과 run() 메소드를 오버라이드 (override) 할 필요가 사용할 수 있습니다. 그리고 Time.schedule() 메서드를 사용해야 작업을 예약 할 수 있습니다.

2

Thread.sleep 그러나 더 나은 옵션이 밖으로 모든 자원을 빨아 아래로 루프를 늦추기 위해 타이머의 일종없이 무한 반복 실행이

long current = System.currentTimeMillis(); 
while(current < expectedElapsedTime){ 
    current = System.currentTimeMillis(); 
    //logic goes here 
} 

유사한 타이머를 사용하는 것이 시나리오에서 사용할 수 있습니다 당신의 컴퓨터를 진공처럼. 작업을 예약 할 수있는 또 다른 방법은 스윙 타이머를 사용하는 것입니다.

ActionListener listener = new ActionListener(){ 
public void actionPerformed(ActionEvent event){ 
    checkUser = true; 
    } 
}; 
Timer checkUserTimer = new Timer(5000, listener); // 5 second pause 
checkUserTimer.start(); // start the timer.