Das folgende Codefragment führt zwei Threads aus, einer ist eine einfache Timer-Protokollierung jede Sekunde, der zweite ist eine Endlosschleife, die eine Restoperation ausführt:
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);
}
}
}
}
Dies ergibt das folgende Ergebnis:
[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
Ich verstehe nicht, warum die unendliche Aufgabe alle anderen Threads für 13,3 Sekunden blockiert. Ich habe versucht, Thread-Prioritäten und andere Einstellungen zu ändern, nichts hat funktioniert.
Wenn Sie Vorschläge zur Behebung dieses Problems haben (einschließlich der Optimierung der Einstellungen für die Betriebssystemumschaltung), lassen Sie es mich bitte wissen.
-Djava.compiler=NONE , wird es nicht passieren.
-XX:+PrintCompilationmir folgenden zu der Zeit bekommt die verlängerten Verzögerungs Ende: TestBlockingThread :: lambda $ 0 @ 2 (24 Byte) KOMPILIERT SKIPPED: trivial Endlosschleife (Neuversuch bei verschiedenem Tiere)