Aşağıdaki kod parçacığı iki iş parçacığı yürütür, biri her saniyede günlük tutan basit bir zamanlayıcıdır, ikincisi kalan işlemi yürüten sonsuz bir döngüdür:
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);
}
}
}
}
Bu, aşağıdaki sonucu verir:
[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
Sonsuz görevin diğer tüm konuları neden 13,3 saniye engellediğini anlamıyorum. İş parçacığı önceliklerini ve diğer ayarları değiştirmeye çalıştım, hiçbir şey işe yaramadı.
Bunu düzeltmek için herhangi bir öneriniz varsa (işletim sistemi bağlam değiştirme ayarlarının değiştirilmesi dahil) lütfen bana bildirin.
-Djava.compiler=NONE
, bu olmayacak.
-XX:+PrintCompilation
I anda aşağıdaki olsun genişletilmiş gecikme biter: TestBlockingThread :: lambda 2 (24 bayt) @ $ 0 DERLEME SKIPPED: (farklı kademedeki yeniden deneme) önemsiz sonsuz döngü