Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813

    controllare se è stato acquistito il lock su una lista

    ciao a tutti...
    ho la seguente situazione: ho un oggetto di tipo timer che scatena un evento ogni n millisecs...
    Allo scattare, un actionPerfomed viene lanciato in una cerca classe...
    Desidererei fare la seguente:
    Se il lock su una lista è acquisito, allora salta, riavvia il timer e attende un altro tick, altrimenti fa certe cose.

    so che c'è il costrutto synchronized, ma questo si ferma e poi riparte non appena il lock è stato rilasciato

    non c'è qualcosa che in pseudo codice divenda:
    IF is Not Locked(myList) THEN
    ...
    ELSE YIELD
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: controllare se è stato acquistito il lock su una lista

    Originariamente inviato da Hysoka
    non c'è qualcosa che in pseudo codice divenda:
    IF is Not Locked(myList) THEN
    ...
    ELSE YIELD
    Occhio a una cosa: un lock è acquisito dal thread che è entrato in un metodo/blocco synchronized. Quindi tu vuoi verificare se è acquisito da chi??

    Esiste il metodo public static boolean holdsLock(Object obj) di Thread (solo da Java 1.4) ma testa solo se il thread corrente ha acquisito il lock su quell'oggetto. E questo metodo lo si usa tipicamente per questioni di testing con le asserzioni, non per fare quello che pensavi.

    Comunque, molto probabilmente, l'uso di un lock intrinseco non è la cosa migliore da usare per quello che forse pensavi di fare. Ma non posso dire di più perché non ho ben chiaro cosa vuoi fare e perché.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    io voglio verificare se un determinato oggetto è "lockato" da qualcuno...sapere chi lo detiene non mi interessa.
    Quello che voglio fare è assai semplice:
    Ad ogni n millsecondi la classe javax.swing.Timer emette un Tick che scatena degli actionPerformed.
    Ad ogn tick di questo timer devo verificare se un determinato oggetto (una lista linkata) è già in possesso da qualcuno...
    Se è in possesso, riavvia il timer e aspetta altri n millsecs
    altrimenti elabora la coda...

    Voi potete dire: ma perché non usi synchronized per aspettare che la coda si liberi?
    Ho necessita di aspettare n millisecs...se poi dopo 3 tick trovo sempre occupato, alla fine userò synchronized...
    mi conviene elaborare + elementi della coda che elaborarni 2 o 3 ad ogni tick
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Hysoka
    Ad ogni n millsecondi la classe javax.swing.Timer emette un Tick che scatena degli actionPerformed.
    Sì, e nota che l'actionPerformed viene invocato nel contesto del EDT e quindi devi cercare di non tenere tu impegnato il thread per troppo tempo.

    Originariamente inviato da Hysoka
    Voi potete dire: ma perché non usi synchronized per aspettare che la coda si liberi?
    Ho necessita di aspettare n millisecs...se poi dopo 3 tick trovo sempre occupato, alla fine userò synchronized...
    mi conviene elaborare + elementi della coda che elaborarni 2 o 3 ad ogni tick
    Non mi risulta che sia possibile solo verificare se di un oggetto è stato acquisito il lock (conoscendo o no il thread). A parte quel metodo holdsLock che ho citato.

    Se usi almeno Java 5 potresti usare i Semaphore o i lock "espliciti" (vedi nei package java.util.concurrent e java.util.concurrent.locks) che offrono anche il timeout (oltre a diverse altre funzionalità). Bisognerebbe solo capire meglio chi sono, dove sono e cosa fanno le varie parti del tuo programma che si "contendono" la esclusività su una certa risorsa (una lista linkata, da quanto dici).

    Ripeto ancora che senza sapere esattamente cosa vuoi fare e perché è difficile rispondere ma sopratutto dire se quello che stai cercando di fare ha senso/è valido o no.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    ti spiego il problema:
    il client riceve i pacchetti dal server e li mette in una coda appena arrivano...
    un altro processo interpreta ed esegue cosa fare in base a quello che c'è scritto nel pacchetto...
    quest'ultimo prende i messaggi dalla coda ed elabora, ma se il lock della coda è stato acquisito, allora aspetto un altro tot di tempo, così che ho più messaggi da elaborare fino alla prossima volta che il server mi manda altri messaggi...
    io l'ho pensata così...
    ma visto che è molto complesso...forse sarà meglio usare il costrutto synchronized
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.