Ich möchte einen Test machen, zwei Thread, ein Thread ändert den Wert, ein anderer Thread eine Weile verwenden, um den ersten Thread zu warten, und dann brechen und zu beenden.Aber die Frage ist der wartende Thread läuft immer, kann nicht mehr aufhören. Eine andere Frage ist, wenn ich den Code von "System.out.println (i +" run ");", der ganze Thread kann normal arbeiten, es ist so seltsam.Thread läuft immer, kann nicht aufhören
import java.util.Date;
public class ThreadTestTwo {
public int a = 0, b = 0,c = 0;
public static void main(String[] args) {
System.out.println(new Date()+"start");
for (int i = 0; i < 100000; i++) {
new ThreadTestTwo().start(i);
if(i % 100000 == 0){
System.out.println(i/100000);
}
}
System.out.println(new Date()+"finish");
}
public void start(final int i){
Thread readThread = new Thread(){
@Override
public void run() {
while (true) {
if(c == 1){
b = a;
// System.out.println(i+", set b "+a);
break;
}
// System.out.println(i + " run");
}
}
};
Thread writeThread = new Thread(){
@Override
public void run() {
a = 1;
c = 1;
}
};
writeThread.setName("mywrite");
readThread.setName("myread");
System.out.println(i+" start");
writeThread.start();
readThread.start();
try {
writeThread.join();
readThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i+" end");
if(b != 1)
throw new RuntimeException("b = "+b);
}
}
Das Konsolenprotokoll ist: '181 Start 181 Ende 182 Start 182 Ende 183 Start 183 Ende 184 Start 184 Ende 185 Start 185 Ende 186 Start 186 Ende 187 Start 187 Ende 188 Starten' Und verwenden jstack den Faden Zustand zu sehen, dass die readThread von "if (c == 1) {" in der Zeile läuft – tongmutou
Make 'a' und 'c' flüchtig oder korrekte Synchronisation verwenden, wenn Felder zwischen Threads geteilt werden. – Andreas