Cuplikan kode berikut mengeksekusi dua utas, satu pengatur waktu sederhana yang mencatat setiap detik, yang kedua adalah loop tak terbatas yang menjalankan operasi sisa:
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);
}
}
}
}
Ini memberikan hasil sebagai berikut:
[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
Saya tidak mengerti mengapa tugas tak terbatas memblokir semua utas lainnya selama 13,3 detik. Saya mencoba mengubah prioritas utas dan pengaturan lainnya, tidak ada yang berhasil.
Jika Anda memiliki saran untuk memperbaikinya (termasuk menyesuaikan pengaturan pengalihan konteks OS), beri tahu saya.
-Djava.compiler=NONE
, itu tidak akan terjadi.
-XX:+PrintCompilation
saya mendapatkan yang berikut pada saat penundaan yang diperpanjang berakhir: TestBlockingThread :: lambda $ 0 @ 2 (24 byte) COMPILE SKIPPED: trivial infinite loop (coba lagi di tingkat yang berbeda)