multithreading - Java while loop can not detect change by thread -
this question has answer here:
i'm new in java thread, write test program:
//mytest.java
public class mytest{ public static void main(string[] args){ mythread thread = new mythread(); int n; thread.start(); while (true){ //system.out.print(""); n = mythread.num; if (n != 0){ system.out.println("<num> has been modified " + n); if (n == -1) break; mythread.num = 0; } } system.out.println("main thread terminated!"); } }
//mythread.java
public class mythread extends thread { public static int num = 0; public void run(){ java.util.scanner input = new java.util.scanner(system.in); int n; while (true){ system.out.print("type number: "); n = input.nextint(); if (n == -1) break; num = n; } input.close(); system.out.println("mythread thread terminated!"); } }
when run this, show message: "type number: " , input number. then, while loop on main class can not detect mythread.num
has been modified. prompt message, , on... type -1, second thread terminated, main thread doesn't show message , never terminated.
i try fix add code system.out.print("")
below while(true)
(as marked comment above). work when type -1, still can not detect.
i'm don't know why command system.out.print("") can make work(but not solution) , problem code. how can fix it?
this because static int num
not marked volatile
. java "knows" num
not going change after first read, not reading again.
change declaration to
static volatile int num;
to fix problem. force memory reads on each access num
.
note: static variables not way of communicating between threads.
Comments
Post a Comment