Allora:

class starter{
public void main(){
new Elaboradati(dati);
}
}

class Elaboradati extends Thread{
public void Elaboradati(dati){

... elaborazione dati...
for (i=0; i<length; i++){
new Connessione(ip, port).start();
}

}
}


class Connessione{

... vari assegnamenti...

public void run(){
try{
connessione all'ip e porta specificati;
aspetta 3 per secondi la risposta
}
catch(eccezione){
se sono trascorsi i tre secondi incrementa il contatore
dei tentativi nel database e...

new Connessione(stesso ip, stessa port).start();

altre operazioni
cancella alcuni record da db
}
}
}

Questo è sbagliato perchè in connessione mi apre sempre nuovi thread mentre io voglio che ritenti di nuovo la connessione alla stessa porta e allo stesso ip sembra iniziare un nuovo thread, altrimenti si sballa tutto, dal conteggio dei timeout (incrementa contatore), che si incrementa alla scadenza del timeout di ogni thread (quindi di continuo), alle connessioni al db che non trova i record da cancellare e altri errori.
Quando non utilizzavo il multithread questo metodo funzionava (anche se era un thread alla volta) dove a posto di

new Connessione(stesso ip, stessa port).start();

c'era

new Connessione(stesso ip, stessa port);

ora invece questo non va più per i motivi che ho detto prima. Non funziona nemmeno inserendo un destroy in questo modo

new Connessione(stesso ip, stessa port).start();
this.destroy;

Ora spero sia chiaro.