Autore Topic: AsyncTask concorrenti  (Letto 1205 volte)

Offline DX89B

  • Utente junior
  • **
  • Post: 121
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Play Store ID:
    Daniele Bonadiman
  • Sistema operativo:
    Mac OS X 10.6
AsyncTask concorrenti
« il: 06 Settembre 2010, 11:25:44 CEST »
0
come è possibile sincronizzare degli AsyncTask che utilizzano in maniera concorrenziale  la stessa risorsa, clientHttp
credo che il problema sia questo perchè il logcat mi segnala questo problema


09-06 11:19:49.840: WARN/System.err(23421):     at org.json.JSONObject.get(JSONObject.java:354)
09-06 11:19:49.840: WARN/System.err(23421):     at org.json.JSONObject.getString(JSONObject.java:510)
09-06 11:19:49.840: WARN/System.err(23421):     at org.liquidjournal.MySubscription$Task.doInBackground(MySubscription.java:110)
09-06 11:19:49.840: WARN/System.err(23421):     at org.liquidjournal.MySubscription$Task.doInBackground(MySubscription.java:1)
09-06 11:19:49.840: WARN/System.err(23421):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
09-06 11:19:49.840: WARN/System.err(23421):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-06 11:19:49.840: WARN/System.err(23421):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-06 11:19:49.840: WARN/System.err(23421):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
09-06 11:19:49.850: WARN/System.err(23421):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
09-06 11:19:49.850: WARN/System.err(23421):     at java.lang.Thread.run(Thread.java:1102)

Offline DX89B

  • Utente junior
  • **
  • Post: 121
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Play Store ID:
    Daniele Bonadiman
  • Sistema operativo:
    Mac OS X 10.6
Re:AsyncTask concorrenti
« Risposta #1 il: 06 Settembre 2010, 11:27:42 CEST »
0
potrei inserire uno spinlock  all interno del mio client http ma credo ci sia soluzione migliore, penso siano deprecati al giorno d'oggi gli spinlock :P :)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AsyncTask concorrenti
« Risposta #2 il: 06 Settembre 2010, 11:35:20 CEST »
0
Non sono molto esperto di concorrenza, ma potresti provare all'interno di ciascun asynctask:

Codice (Java): [Seleziona]
synchronized (oggettoDiCuiFareIlLock){
//Usi l'oggetto di cui sopra
}

Comunque, sicuro si tratti di un errore di questo tipo? Da quello che hai postato non si capisce.

Offline DX89B

  • Utente junior
  • **
  • Post: 121
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Play Store ID:
    Daniele Bonadiman
  • Sistema operativo:
    Mac OS X 10.6
Re:AsyncTask concorrenti
« Risposta #3 il: 06 Settembre 2010, 11:36:04 CEST »
0
nel senso volevo creare una variabile statica boolean nel client Http
un thread va a controllare se la risorsa è disponibile se si entra  setta la variabile a false e fa quello che deve fare e poi la rilascia  (setta a true la variabile)quando ha finito , se la risorsa non è disponibile entra in un ciclo infinito controllando ad ogni giro se la variabile è a true, dovrebbe funzionare ma mi sembra dispendioso in termini di prestazioni

Offline DX89B

  • Utente junior
  • **
  • Post: 121
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Play Store ID:
    Daniele Bonadiman
  • Sistema operativo:
    Mac OS X 10.6
Re:AsyncTask concorrenti
« Risposta #4 il: 06 Settembre 2010, 11:37:48 CEST »
0
Non sono molto esperto di concorrenza, ma potresti provare all'interno di ciascun asynctask:

Codice (Java): [Seleziona]
synchronized (oggettoDiCuiFareIlLock){
//Usi l'oggetto di cui sopra
}

Comunque, sicuro si tratti di un errore di questo tipo? Da quello che hai postato non si capisce.
non riesco a capirlo, quello che mi ha fatto pensare alla concorrenza è questo
09-06 11:19:49.840: WARN/System.err(23421):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-06 11:19:49.840: WARN/System.err(23421):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-06 11:19:49.840: WARN/System.err(23421):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
09-06 11:19:49.850: WARN/System.err(23421):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)

ma probabilmente è solo  il nome del pacchetto che gestisce i thread

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AsyncTask concorrenti
« Risposta #5 il: 06 Settembre 2010, 11:38:46 CEST »
0
Manca il nome dell'eccezione che è stata sollevata....

Comunque, non scrivere doppi post, usa il tasto modifica :)

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:AsyncTask concorrenti
« Risposta #6 il: 09 Settembre 2010, 00:36:59 CEST »
0
nel senso volevo creare una variabile statica boolean nel client Http
un thread va a controllare se la risorsa è disponibile se si entra  setta la variabile a false e fa quello che deve fare e poi la rilascia  (setta a true la variabile)quando ha finito , se la risorsa non è disponibile entra in un ciclo infinito controllando ad ogni giro se la variabile è a true, dovrebbe funzionare ma mi sembra dispendioso in termini di prestazioni

così useresti una specie di metodo della bandiera. chi entra per primo alza la bandiera (mette la varibile a true) e quando finisce la abbassa (mettendo a false), ma in questo modo non si riesce a gestire correttamente la concorrenza. Devi usare i Monitor che java ti mette a disposizione con il metodo Synchronized.

Definisci Synchronized il metodo concorrente e java fa tutto :)

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:AsyncTask concorrenti
« Risposta #7 il: 09 Settembre 2010, 09:44:07 CEST »
0
Manca il nome dell'eccezione che è stata sollevata....

Offline DX89B

  • Utente junior
  • **
  • Post: 121
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Play Store ID:
    Daniele Bonadiman
  • Sistema operativo:
    Mac OS X 10.6
Re:AsyncTask concorrenti
« Risposta #8 il: 09 Settembre 2010, 10:14:16 CEST »
0
ops, avevo dimenticato questo post :)
Codice: [Seleziona]
at java.util.concurrentmi aveva tratto in inganno, non si trattava di un problema di concorrenza, quella era solo una libreria standard di java che gestisce i task,
niente era un semplice problema di Json , quella libreria era stata chiamata di conseguenza, credo che http client gestisca autonomamente la concorrenza :)
Grazie lo stesso , topic risolto

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:AsyncTask concorrenti
« Risposta #9 il: 09 Settembre 2010, 10:19:04 CEST »
0
ops, avevo dimenticato questo post :)

Felice che hai risolto, ma per la prossima volta sappi che ancora non hai specificato l'eccezione che ti ha dato, che è proprio la parolina che sta prima di "at java.util.concurrent"!  :-P

Offline DX89B

  • Utente junior
  • **
  • Post: 121
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Play Store ID:
    Daniele Bonadiman
  • Sistema operativo:
    Mac OS X 10.6
Re:AsyncTask concorrenti
« Risposta #10 il: 09 Settembre 2010, 10:33:40 CEST »
0
sisi me ne sono accorto è che nei log l'eccezione era lanciata come warning e non come error e non ci ho fatto caso :)

Grazie a tutti