Nel seguente codice, se uso l'istruzione sysout all'interno di loop, il codice viene eseguito e passa all'interno del ciclo dopo la condizione soddisfatta, ma se non uso l'istruzione sysout all'interno loop poi poi il ciclo infinito continua senza entrare nella condizione if anche se la condizione if è soddisfatta .. qualcuno può aiutarmi per favore a trovare il motivo esatto per questo. Solo una dichiarazione sysout fa sì che la condizione if diventi vera. perché è così?Ritardo nel thread in esecuzione a causa di system.out.println statement
Il codice è il seguente: -
class RunnableDemo implements Runnable {
private Thread t;
private String threadName;
RunnableDemo(String name){
threadName = name;
System.out.println("Creating " + threadName);
}
public void run() {
System.out.println("Running " + threadName);
for(;;)
{
//Output 1: without this sysout statement.
//Output 2: After uncommenting this sysout statement
//System.out.println(Thread.currentThread().isInterrupted());
if(TestThread.i>3)
{
try {
for(int j = 4; j > 0; j--) {
System.out.println("Thread: " + threadName + ", " + j);
}
} catch (Exception e) {
System.out.println("Thread " + threadName + " interrupted.");
}
System.out.println("Thread " + threadName + " exiting.");
}
}
}
public void start()
{
System.out.println("Starting " + threadName);
if (t == null)
{
t = new Thread (this, threadName);
t.start();
}
}
}
public class TestThread {
static int i=0;
public static void main(String args[]) {
RunnableDemo R1 = new RunnableDemo("Thread-1");
R1.start();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
i+=4;
System.out.println(i);
}
}
uscita senza sysout economico nel ciclo infinito: - enter image description here
uscita con la dichiarazione sysout nel ciclo infinito: - enter image description here
Im che va indovinare si esegue in problemi volatili. Prova a creare static int i = 0; static volatile int i = 0; Se il comportamento è ora lo stesso mal si mette una risposta con una spiegazione. –
@Aaron È un loop infinito, quindi continuano a eseguirlo costantemente, giusto ...? EDIT: Aaron ha lasciato l'edificio. –
@Henk de Boer, ho provato a utilizzare volatile e funziona bene. Ma puoi spiegare che cosa cambia l'istruzione sysout che permette al codice di funzionare anche senza usare parole chiave volatili. –