Đoạn mã sau đây thực thi hai luồng, một là một bộ đếm thời gian đơn giản ghi nhật ký mỗi giây, thứ hai là một vòng lặp vô hạn thực hiện một thao tác còn lại:
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);
}
}
}
}
Điều này cho kết quả như sau:
[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
Tôi không hiểu tại sao tác vụ vô hạn chặn tất cả các luồng khác trong 13,3 giây. Tôi đã cố gắng thay đổi các ưu tiên của luồng và các cài đặt khác, không có gì hoạt động.
Nếu bạn có bất kỳ đề xuất nào để khắc phục điều này (bao gồm điều chỉnh cài đặt chuyển đổi ngữ cảnh của hệ điều hành), vui lòng cho tôi biết.
-Djava.compiler=NONE
, điều đó sẽ không xảy ra.
-XX:+PrintCompilation
tôi nhận được những điều sau tại thời điểm trì hoãn kéo dài kết thúc: TestBlockingThread :: lambda $ 0 @ 2 (24 byte) MÁY TÍNH BỎ: Vòng lặp vô hạn tầm thường (thử lại ở các tầng khác nhau)