2010-07-19 2 views
0

Timer를 프로세스 인터럽트 메커니즘으로 사용하고 있습니다.Timer 및 TimerTask를 사용할 때의 Java 스레드 실행 순서

T0은 : 다음 논리 흐름은 T0에서 새로운 타이머를 생성하고 T2에서 실행할 새로운 타이머 태스크를 예약 (1 번째 작업 지연, 작업이 매우 간단 - 세트 플래그 변수)

T1 : 주요 호출 스레드에서 5 초

T2가 : 타이머 스레드에서, 작업이 실행

T5 : 수면

T6 완료 : 취소 타이머 및 예약 된 작업을

이 코드는 내 Windows 및 Ubuntu 개발 환경에서 완벽하게 작동합니다. 내 SLES 10 서버를 구축 동일한 코드를 실행할 때, 기록이 실행 순서를 나타냅니다

T0 : 타이머와 타이머 작업은 T2에서

T1을 실행하기 위해 작성됩니다 메인 스레드 5 초

잔다

T5는 : 타이머

T7 취소 : 작업이

을 수행 할 수 사람의 서비스 메인 스레드는

T6가 깨어 나면 이것이 일어나는 이유에 대한 설명? 매우 감사합니다.

+0

어떤 로깅 메커니즘을 사용하고 있습니까? 로그가 올바르게 플러시되지 않을 수도 있습니다. – Tom

+0

log4j를 사용하고 있습니다. 나는 각 단계마다 System.currentTimeMillis를 사용하여 타임 스탬프를 기록하므로 로그 출력의 순서가 범인이 아니기를 바랍니다. – Chrom

답변

0

흠. 나는 당신이 많은 차이를 (초 단위로) 볼 수 있다는 것에 놀랐지 만, 기계에서 기계, jvm에서 jvm 등과 같은 다른 순서의 실행을 볼 수 있다고 생각합니다. 특히 JIT가 코드를 컴파일 할 때 처음에는 예를 들어 코드에서 100-300 밀리 초 정도의 지연이 발생하는 경향이 있습니다 (예 : 동일한 코드의 후속 실행과 비교). 따라서 코드에서 더 극적 일 수 있습니까?

"프로세스 인터럽트 메커니즘"의 의미를 모르십니까? 타이머 작업이 일부 스레드를 인터럽트한다는 의미입니까?

어쨌든 내가 지금 제안 할 수있는 것은 System.nanoTime()을 대신 사용하는 것입니다. (나는 그것이 무엇이든 설명 할 것이라고는 생각하지 않지만 심각한 측정에서는 System.currentTimeMillis()의 사용을 권장하지 않습니다). JAVA_OPTS에 -server을 추가하면 코드가 JIT에 의해 최적화 될 때 동작을 볼 수 있도록 일반적으로 권장됩니다. 또한 코드를 여러 번 실행하고 통계를 작성하는 것이 좋습니다.

내가 너라면, 먼저 작은 것들을 수행하고 CyclicBarrier, CountdownLatch과 같은 싱크로 나이저를 사용하여 디버깅을하고 정확하게 지연이 오는 것을 확인하십시오.

SLES에서 "배경 잡음"(활동도)은 무엇입니까? 아마도 OS가 매우 바쁜가 아니면 뭔가?

작업의 성격은 무엇입니까? 네트워크/IO 관련 사항이 있습니까?

0

타임 스탬프 문제가 발생했습니다. System.currentTimeMillis 대신에 새로운 Date(). getTime을 사용하면 예상되는 실행 순서의 타임 스탬프가 생성되었습니다.

모든 좋은 아이디어 주셔서 감사합니다.

0

작업이 완료되면 이벤트가 발생하는 것을 고려해야합니다. 그것은 실행 명령을 보장합니다.