Newsgroup: it.comp.java
Titolo: Dubbio : Sincronizzazione e Thread

Spero che perdonerete le seguenti domande, ma credo che i miei problemi
derivino da qualche concetto poco chiaro nella mia testa.
1 - se da dentro un ciclo while, inserito nel run() del Thread, chiamo un
metodo della stessa classe (la classe implementa runnable), il thread esegue
prima il codice di tale metodo e poi continua oppure lo esegue in maniera
asincrona?
Vi chiedo questo perchè ho notato dai system.out, che tra quello di inizio
metodo e quello di fine metodo, compare quello del run quando riceve dati.
esempio :
run(){
    while(condizione){
        int x = myIO.readInt();
        System.out.println(" Il RUN ha letto "+i);
        if(x = 23) // spero che 23 porti fotuna
            spedisci_dati();
    }
}
spedisci_dati(){
    System.out.println("         Inizio");
        InputStream is = myIO.getInputStream();
        // passo is, al package delle JPEG
        // la prima volta funziona, la seconda si pianta.
    System.out.println("         Fine");
}
"myIo" è una classe che mi svincola da dover gestire ogni volta la lettura e
la scrittura dei dati. Gli passo una Socket e lei crea un ObjectOutputStream
e un ObjectInputStream, con i quali lavoro.
La istanzio dentro il server, la istanzio nel client e il gioco è fatto.
I metodi di questa classe sono tutti sincronizzati.
2 - Se volessi rendere sincronizzato l'accesso ad una risorsa, come faccio?
Ad esempio l'uso della Socket? E' possibile?
La dichiarazione :
    syncrhonized Socket soc etc.
non viene accettata.
Se uso dei metodi synchronizzati per leggere e scrivere su una Socket, e per
una volta mi serve di passare la sochet direttamente a qualche metodo (come
nel mio casio che la devo passare alla JPeg) non richio di perdere tale
proprietà?
3 - Che differenza c'è tra " interrupted" e "isInterrupted" ?
Grazie mille a tutti.

 3 - Che differenza c'è tra " interrupted" e "isInterrupted" ?
interrupted e' static, testa il thread corrente.
Hope it helps...
-- Giuseppe

 sinronizzati intorno alla risorsa ed usa sempre quello.
Fatto. Solo che ad un certo punto devo per forza di cose passare il socket
contenuto nel wrapper, al metodo di Encodin/Decoding della jpeg. A quel
punto sono scoperto. Ecco perchè volevo sapere se fosse possibile
sincronizzare direttamente la risorsa.
Anche se aggiungo altri 2 metodi dentro il mio wrapper, che si occupano di
fare l'Encoding/Decoding della JPeg, (i metodi sono tutti sincronizzati) se
arrivano due chiamate a differenti metodi che lavorano entrambi lavorano su
quel socket (ad esmpio arriva la chiamata all'Encoding e alla scrittura di n
byte), comunque avrei una collisione, giusto? Ecco che allora devo trovare
il modo di sincronizzare la risorsa Socket.
Grazie mille.


Tutto quello che ti serve e' un blocco sincronizzato, simile a questo, che devi usare
all'atto di agire sul socket dai differenti thread:
synchronized(mySocket)
{
    // hai acquisito il lock sul socket qui
    mySocket.write(..);
    ...
    ...
    mySocket.write(..);
}
I metodi sincronizzati non fanno altro che richiedere implicitamente all'atto
dell'esecuzione il lock sull'oggetto relativo, ma lo rilasciano all'uscita: in questo caso
invece tu lo richiedi esplicitamente per un tempo piu' lungo. Ovviamente in _tutti_ i
punti in cui richiedi l'uso del socket devi usare lo stesso meccanismo, richiedendo ogni
volta il lock. 
Sarebbe meglio se tu avessi qualcosa che ti incapsula il socket, con dei metodi di alto
livello, e all'interno di quello sincronizzassi l'accesso al socket. 
Ciao,
    Bruno.
---
| Bruno Bossola 
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola
|
| (rimuovere gli spazi dall'indirizzo per rispondere via email)

Grazie infinite, ora miglioro il mio wrapper, aggiungendo le funzioni più a
rischio emodificando le altre con il tuo esempio.
Ti faccio sapere se tutto migliora.
Grazie mille!!!!