Un errore di overflow capita di solito quando una funzione viene richiamata ricorsivamente fino ad esaurire lo stack. Controlla di non avere, per esempio, all'interno del costruttore, un'istruzione che crea un oggetto della stessa classe, oppure una funzione che esegue ricorsivamente molti calcoli su un array molto grande.
Per la seconda domanda, dipende da come hai implementato i metodi up() e down(). Per esempio puoi utilizzare una variabile booleana che identifica il verso e fare una cosa del genere:
codice:
...
boolean verso = true; //TRUE = SU, FALSE = GIU
...
public void up() {
while (verso) {
// fai quello che devi fare
}
}
public void down() {
while (!verso) {
// fai quello che devi fare
}
}
In questo modo i due metodi vengono eseguiti in modo mutuamente esclusivo (una variabile non può assumere più di un valore istantaneamente).
Per quello che devi fare tu (stai parlando di Snake), credo che la soluzione migliore consista nell'usare un thread per gestire il moto del serpente.
Ciao.