निम्नलिखित कोड स्निपेट दो थ्रेड को निष्पादित करता है, एक हर सेकंड लॉगिंग करने वाला एक साधारण टाइमर है, दूसरा एक अनंत लूप है जो एक शेष ऑपरेशन को निष्पादित करता है:
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 :: लैम्ब्डा $ 0 @ 2 (24 बाइट्स) संकलन छोड़ा गया: तुच्छ अनंत लूप (विभिन्न स्तर पर फिर से प्रयास करें)