Ich habe Klasse Run. Ist einfach, nur druckt, schläft und druckt dann;Warum Objekt nicht gesperrt ist, während der Thread im Runnable-Status ist?
public class Run implements Runnable {
@Override
public void run() {
System.out.println("START RUN");
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("FINISH RUN");
}
}
Ok jetzt schreibe ich test;
public static synchronized void main(String[] args) throws InterruptedException {
Run r = new Run();
Thread t = new Thread(r, "TEST");
t.start();
// EXECYTE THE CODE WHULE THREAD "TEST" IS RUNNABLE
synchronized (t) {
System.out.println(t.getState());
t.wait();
}
System.out.println("Y");
// SLEEP THREAD "TEST" TO BE EXECUTED DURING THE TIME
Thread.sleep(100);
synchronized (t) {
System.out.println(t.getState());
t.wait();
}
System.out.println("Y2");
}
Frage 1: Während thread "TEST" ausführt, ich versuche() zu warten. In diesem Moment lautet der Thread-Status "RUNNABLE". Wegen dieses Status ist es nicht warten, verstehe ich nicht warum? Wenn der Status "TERMINATED" oder "NEW" lautet, funktioniert wait(); Wenn ich t.start() entferne, ist der Thread-Status "NEW", also funktioniert auch wait. Kannst du mir sagen, was passiert?
OUTPUT:
START RUN
RUNNABLE
FINISH RUN
Y
TERMINATED`
Schnelle Frage: was denkst du 't.wait()' tut? – biziclop
Dies zeigt nur den Status an, wenn der Thread startet. 'Thread.sleep' sperrt nichts. –
Bewirkt, dass der aktuelle Thread wartet, bis ein anderer Thread notify oder notifyAll aufruft. Wenn t.wait() ausgeführt wird, schläft der Thread zum einen, sodass er nicht wartet. aber nachdem der Thread ausgeführt wird, wird er gehängt – grep