다음 코드 조각은 두 개의 스레드를 실행합니다. 하나는 매초 간단한 타이머 로깅이고, 두 번째는 나머지 작업을 실행하는 무한 루프입니다.
public class TestBlockingThread {
private static final Logger LOGGER = LoggerFactory.getLogger(TestBlockingThread.class);
public static final void main(String[] args) throws InterruptedException {
Runnable task = () -> {
int i = 0;
while (true) {
i++;
if (i != 0) {
boolean b = 1 % i == 0;
}
}
};
new Thread(new LogTimer()).start();
Thread.sleep(2000);
new Thread(task).start();
}
public static class LogTimer implements Runnable {
@Override
public void run() {
while (true) {
long start = System.currentTimeMillis();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// do nothing
}
LOGGER.info("timeElapsed={}", System.currentTimeMillis() - start);
}
}
}
}
결과는 다음과 같습니다.
[Thread-0] INFO c.m.c.concurrent.TestBlockingThread - timeElapsed=1004
[Thread-0] INFO c.m.c.concurrent.TestBlockingThread - timeElapsed=1003
[Thread-0] INFO c.m.c.concurrent.TestBlockingThread - timeElapsed=13331
[Thread-0] INFO c.m.c.concurrent.TestBlockingThread - timeElapsed=1006
[Thread-0] INFO c.m.c.concurrent.TestBlockingThread - timeElapsed=1003
[Thread-0] INFO c.m.c.concurrent.TestBlockingThread - timeElapsed=1004
[Thread-0] INFO c.m.c.concurrent.TestBlockingThread - timeElapsed=1004
무한 작업이 다른 모든 스레드를 13.3 초 동안 차단하는 이유를 이해할 수 없습니다. 스레드 우선 순위 및 기타 설정을 변경하려고 시도했지만 아무것도 작동하지 않았습니다.
이 문제를 해결하기위한 제안 (OS 컨텍스트 전환 설정 조정 포함)이 있으면 알려주세요.
-Djava.compiler=NONE
발생하지 않습니다.
-XX:+PrintCompilation
확장 된 지연이 끝날 때 다음과 같이 실행합니다 . TestBlockingThread :: lambda $ 0 @ 2 (24 바이트) COMPILE SKIPPED : trivial infinite loop (retry at different tier)