Newsgroup: it.comp.java
Titolo: sempre thread, scusate :(

Ciao a tutti, 
ho un oggetto Test che ha un metodo main che contiene 
una situazione simile a questa:
public static void main(String[] args) {
 
        MyClass mc = null; 
 
        mc = new MyClass();
        mc.setMyVar("xxx");
 
        Thread cliente_uno = new Thread(mc);
 
        mc = new MyClass();
        mc.setMyVar("yyy");
 
        Thread cliente_due = new Thread(mc);
		cliente_uno.start();
        cliente_due.start();
 
        ....... etc etc
e in MyClass ho un public void run() che chiama un metodo syncrohronized 
al quale accedono in sequenza cliente_uno e cliente_due.
Fin qui tutto ok, se lancio la classe Test funziona tutto perfettamente, 
ma se arriva un'altra chiamata a Test
il metodo syncrohronized di MyClass va in parallelo(logicamente, sono 
due oggetti differenti) a quello gia' in esecuzione dalla chiamata
precedente(se non ha ancora terminato), come faccio a rendere *veramente*
unica l'esecuzione di quel metodo.
Considerate che questa applicazione e' un jar eseguito 
da una chiamata php :S quindi ho una cosa del tipo:
shell_exec( "cd /my/dir/app && $JAVA_BIN -jar myapp.jar ".$params." );
Mi sto fulminando il cervello!
Grazie, cris.

usa un metodo statico (o rendi l'oggetto un singleton)
ciao
uL


Se vuoi sincronizzare programmi che lavorano su istanze diverse
della JVM io darei un'occhiata a "Creating a File Lock on a File"
http://javaalmanac.com/egs/java.nio/SharedLock.html
--
Marco

 usa un metodo statico (o rendi l'oggetto un singleton)
Ho provato a fare come dici, con singleton, ma mi pare funzioni solo con
gli oggetti MyClass istanziati all'interno dell'applicazione(giustamente)
non per l'applicazione in se

Cristian ha scritto:



non capisco cosa vuoi dire. Se c'è un solo oggetto in tutta la VM ed ha il
metodo sincronizzato, non hai problemi. Certo che se qualcun'altro ne crea
altre copie nella stessa VM (come?) oppure tu lanci altre VM, non hai
risolto.
uL
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 risolto.
Cerco di spiegarmi meglio...
ho una applicazione web php che a seconda di alcune richieste lancia in
background il mio programma java, che e' un jar.
Nel momento in cui php chiama quel jar si possono scatenare n thread a
seconda della richiesta i quali vengono processati in modo sequenziale da
un metodo private synchronized static, e fin qui tutto ok i thread
rispettano l'ordine di chiamata e le priorita' e nessuno si accavalla.
Il problema nasce nel momento in cui da una pagina web viene fatta una
nuova chiamata all'applicativo java e se la chiamata precedente non e'
ancora terminata le due vanno i parallelo e mi trovo in esecuzione due
programmi java che lavorano per i fatti loro e quindi con due accessi al
metodo synchronized e cosi via se vengono effettuate altre chiamate.
in pratica 
 ->http request1->php->jar
 `--- n thread vengono lanciati
 ->http request2->php->jar
 `--- n thread vengono lanciati
infatti in shell mi trovo due processi differenti
Non so se sono riuscito a spiegrarmi abbastanza bene
Ciao,
cristian.

Ho risolto facendo un serverino xml-rpc (perche' non ci ho pensato prima)
grazie per l'aiuto.
Ciao,
Cristian.

 metodo synchronized e cosi via se vengono effettuate altre chiamate.
A questo punto hai due JVM differenti, e la soluzione è da cercare nella 
comunicazione tra processi.
Potresti utilizzare i socket o le pipe per far comunicare le due JVM, ma 
  sinceramente nel tuo caso vedrei molto meglio (se possibile) 
l'utilizzo di una servlet invece che di un applicativo stand-alone.
Tieni presente che la soluzione che stai addottando è in linea di 
principio decisamente esposta al rischio di pericolose quanto semplici 
possibilità di "attacco".
IMHO lavorando dentro un servlet container avresti gestione dei thread 
praticamente "gratuita" e un livello di protezione migliore da questo 
genere di eventualità.
pole
-- 
ammentos - a lightweight persistence framework for JDK5
http://www.sourceforge.net/projects/ammentos
http://ammentos.biobytes.it

 Ho risolto facendo un serverino xml-rpc (perche' non ci ho pensato prima)
ti bastava una servlet, con in piů il plus di poter gestire eventuale HA e
LB, cosa piů difficile col serverino xml-rpc.
E oltretutto piů performante
ciao
