PDA

View Full Version : [JAVA] interrompere e riprendere l'esecuzione di codice


xplorer87
14-07-2008, 00:16
Originariamente inviato da xplorer87
ciao ragazzi, ho il seguente problema, abbastanza complicato. ho numerose istanze relative a due classi di oggetti che interagiscono tra di loro, Oggetto1 e Oggetto2 con i rispettivi metodi metodo1() e metodo2(). consideriamo il caso in cui abbia diverse istanze di Oggetto1 ed una sola istanza di Oggetto2(). ciò che mi servirebbe realizzare è un comportamento di questo tipo:





public void metodo1() // relativo all'Oggetto1
{
//fai qualcosa

//blocca l'esecuzione del codice di questo metodo relativo all'Oggetto1 corrente e salva il suo stato (cioè il punto fin dove ho eseguito il codice) in una lista comune a tutti (statica)

// fai altre cose

//sblocca l'Oggetto2 che sicuramente si è messo nella lista dopo avermi sbloccato

// riesegui metodo1() tra un certo numero di secondi
}

public void metodo2() // relativo all'Oggetto2
{
//fai qualcos'altro

//controlla nella lista statica degli oggetti se c'è qualche Oggetto1 in attesa, estrailo dalla lista (secondo un criterio assegnato e ben preciso) e riprendi l'esecuzione del codice relativo (cioè sbloccalo)
// blocca l'esecuzione del codice di questo metodo relavito all'Oggetto2 e salva salva il suo stato nella lista

// fai altre cose ancora

// riesegui metodo2() tra un certo numero di secondi
}

due problemi in uno quindi: sospendere e riprendere l'esecuzione di codice (soluzione: usare i thread?) e riplannare l'esecuzione del codice dopo un tot numero di secondi (soluzione: usare le classi Timer e TimerTask)

da tenere presente che, vista la dinamica del problema, i due oggetti si "bloccano" a vicenda, pertanto i due metodi non verranno mai eseguiti simultaneamente.

per la prima, ho provato senza successo con i wait() e notify(), che però non sembrano adattarsi bene all'esigenza che ho di avere multiple istanze di Oggetti1. tentando di evitare l'utilizzo dei deprecati suspend() e resume() sui thread (che comunque presenta lo stesso qualche problema) cosa potrei fare?

per la seconda, Timer mi sembra abbia una gestione poco efficiente dei rescheduling di task a intervalli di tempo variabili, in quanto ogni volta dovrei rischedulare un new TimerTask() (cosa fattibile nel caso di Oggetto1 visto che ne ho già istanze multiple e potrei quindi farla estendere direttamente da TimerTask, un po' più inefficiente nel caso di Oggetto2 di cui devo tenere solo una istanza). ci sono classi built-in alternative che fanno questo?


tengo conto della complessità del problema esposto e ringrazio chiunque mi dia anche una piccola imbeccata ;)