ข้อมูลโค้ดต่อไปนี้เรียกใช้เธรดสองเธรดหนึ่งคือการบันทึกตัวจับเวลาอย่างง่ายทุกวินาทีวินาทีคือลูปแบบไม่มีที่สิ้นสุดที่รันการดำเนินการที่เหลือ:
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 วินาที ฉันพยายามเปลี่ยนลำดับความสำคัญของเธรดและการตั้งค่าอื่น ๆ แล้วไม่ได้ผล
หากคุณมีข้อเสนอแนะในการแก้ไขปัญหานี้ (รวมถึงการปรับแต่งการตั้งค่าการสลับบริบทของระบบปฏิบัติการ) โปรดแจ้งให้เราทราบ
-Djava.compiler=NONE
มันจะไม่เกิดขึ้น
-XX:+PrintCompilation
ฉันได้รับสิ่งต่อไปนี้ในเวลาที่การหน่วงเวลาขยายสิ้นสุดลง: TestBlockingThread :: lambda $ 0 @ 2 (24 bytes) COMPILE SKIPPED: trivial infinite loop (ลองอีกครั้งในระดับที่แตกต่างกัน)