Se ci dici l'errore completo (ovvero a che riga di codice si genera) magari possiamo essere un p' più di aiuto. L'unica cosa che mi viene in mente è questa: dato che l'eccezione che si verifica succede quando un processo viene messo in sleep o in wait e non potrebbe esserlo (classico: non è sincronizzato su un oggetto che funge da "controllore") l'errore potrebbe essere nella classe Elaborato1 (riga in grassetto):
DxId=0;
SxId=0;
for (int c = 0 ; c <20; c++){
direzione=(int) ((Math.random()*10)%2);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
Come vedi lo sleep è fatto senza che il metodo si sincronizzi su qualcosa. Va bene anche se stessi (il this).
Prova a sostituire:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
con:
syncronized(this){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}