public class Main2 {
public static void main(String[] args) {
new Test2().start();
new Test2().start();
}
}
class Test2 extends Thread {
@Override
synchronized public void run() {
try {
System.out.println("begin wait");
wait();
} catch (Exception ex) {
}
}
}
Come il risultato effettivo di esecuzione del test: iniziano attesa, cominciano attesa, due volte dai due fili. Contrasto al risultato previsto: begin wait, solo una volta da uno dei due thread, perché wait() viene chiamato all'interno del metodo run() sincronizzato. Perché è possibile chiamare la sospensione del thread di attesa di Object()?Chiama per Java Object wait() rompe la sincronizzazione dei thread
Grazie mille!
public class Main3 {
public static void main(String[] args) {
Test3 t = new Test3();
new Thread(t).start();
new Thread(t).start();
}
}
class Test3 implements Runnable {
synchronized public void run() {
try {
System.out.println("begin wait");
wait();
} catch (Exception ex) {
}
}
}
@akf & @Sean Owen
Grazie per le vostre risposte. Scusa per il mio errore, ora ho modificato il codice per posizionare la sincronizzazione sullo stesso oggetto run(), il risultato è rimasto: inizio attesa, inizio attesa, due volte.
@akf
attesa sarà rilasciare il blocco che sincronizzare ha afferrato, e sarà ri-ottenuto una volta che il filo viene notificato.
Potresti elaborare un po '?
Grazie per l'esempio e riferimento javadoc! – sof
Potrebbe essere utile notare che la scelta del thread da riattivare è arbitraria. Una buona implementazione sarà equa e notificherà i thread nell'ordine in cui hanno chiamato wait(), ma non è obbligatorio. Quindi l'unico vincolo è che '[N]. il passaggio 1' prima di '[N]. passo 2', dove N è consistentemente 1 o 2. –
@ Mark Peters, questo è un buon punto per fare - anche se potrebbe non sembrare arbitrario (cioè, la prova empirica potrebbe cercare di convincerti che è ordinata), lì non è una garanzia. – akf