Newsgroup: it.comp.java
Titolo: Timer e TimeoutException

Ciao a tutti!
Sto sviluppando un'applicazione multi-thread in Java nella quale devo
implementare un metodo che legge in un buffer un messaggio, se
presente, altrimenti si mette in attesa per un massimo di millisecondi
stabiliti dalla variabile timeout. La definizione del metodo è la
seguente:
public T receive(long timeout) throws TimeoutException
dove TimeoutException è:
class TimeoutException extends Exception{}
pensavo di sviluppare il metodo in questo modo:
ArrayList<Thread> listaAttesa = new ArrayList<Thread>();
public synchronized T receive(long timeout) throws TimeoutException
{
	//attesa se buffer è vuoto o se ci sono altri thread in attesa
	if(count==0 || inAttesa>0)
	{
		long m_rate=100;
		long m_elapsed=0;
		//aggiunge alla lista di attesa
		listaAttesa.add(Thread.currentThread);
		//attende il suo turno (FIFO)
		while(true)
		{
			Thread.currentThread.sleep(m_rate);
			m_elapsed += m_rate;
			if(m_elapsed > timeout)
				throw new TimeoutException();
			if( listaAttesa.get(0)==Thread.currentThread )
			{
				listaAttesa.remove(0);
				break;
			}
		}
	}
	T msg = buffer[out];
	return msg;
}
credo che funzioni bene in questo modo...
Ma se volessi utilizzare un Timer? Come dovrei fare? Qualcuno mi ha
parlato di classi Timer e TimerTask di java.util...
Grazie mille!

 parlato di classi Timer e TimerTask di java.util...
la Timer e' una classe che una volta attivata, aspetta tot tempo, e
quando il tempo e' passato fa qualcosa.
Per sapere come usarlo ti rimando alle API e ai tutorial della Sun.
Ciao Jack

 Ciao Jack
Grazie per la risposta Jack. Forse è meglio se spiego più in dettaglio
il mio problema:
Ho un thread che deve ricevere un messaggio. Se il messaggio non
arriva entro timeout millisecondi viene lanciata un'eccezione,
altrimenti termina restituendo il messaggio pervenuto.
Il metodo che dovrei implementare dovrebbe essere: public synchronized
Object receive(long timeout);
Ho pensato a qualcosa del genere:
public class TimeoutException extends Exception {}
public class MyTask extends TimerTask
{
    public void run()
    {
        System.out.println( "Running the task" );//dovrei lanciare da
qui l'eccezione TimeoutException ???
    }
}
public class SistCom
{
	.
	.
	public synchronized Object receive(long timeout) throws
TimeoutException
	{
		//attesa (con timeout)
		if(messaggi==0)
		{
			Timer timer = new Timer();
			TimerTask task = new MyTask();
			//avvia il timer per il timeout
			timer.schedule(task,timeout);
			while(messaggi==0)
			{
				try{ wait(); } catch(InterruptedException e){}
			}
			//ferma il timer
			timer.cancel();
		}
		Object msg = buffer[out];
		return msg;
	}
}
Domanda: come faccio a far lanciare la TimeoutException? Sembrerebbe
che dovrebbe lanciarla il timer... ma non è possibile farlo dal metodo
run() di MyTask...
Grazie mille in anticipo!
Ciao

 altrimenti termina restituendo il messaggio pervenuto.
Ma ti serve veramente avere una thread apposita per leggere il
messaggio? Il messaggio da dove arriva (porta seriale, socket tcp/
ip,...)? Perche' la maggior parte delle classi che leggono/scrivono su
qualcosa implementano una cosa chiamata lettura NON bloccante, che
permette di far partire la lettura e intanto che si aspetta il
messaggio da leggere si puo' fare altro, quando la lettura va in
timeout viene lanciata un eccezzione automaticamente.
Ciao Jack


Si mi serve un thread apposito, perchè sto progettando una mailbox che
deve ricevere messaggi da più threads mittenti...