Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Multithread

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    20

    Multithread

    Ciao a tutti,
    avrei bisogno di un consiglio prima che combini una cavolata
    Ho due thread:
    - Il primo thread aggiunge o rimuove o aggiorna gli elementi di un ArrayList (gli elementi sono classi con attributi/metodi)
    - Il secondo thread, all'inizio di ogni iterazione dovrebbe prelevare il contenuto totale di questo ArrayList (non una copia degli elementi dell'array, ma proprio gli elementi stessi) e operare sui singoli elementi, modificandone il contenuto (non aggiunge/rimuove elementi dall'ArrayList)
    Questi due thread partono col programma e terminano al termine del programma

    Essendo due thread ovviamente devo sincronizzare le operazioni, ma devo solo sincronizzare i metodi di set/get della classe contenuto nell'ArrayList? Basta questo? Come lo risolvereste voi questo problema?

    O dovrei usare qualche cosa tipo code sincronizzate, che sinceramente non conosco

    Grazie mille

  2. #2
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Detto così mi pare che il multithread sia superfluo... ad ogni iterazione il primo thread deve attendere che il secondo esegua le sue elaborazioni prima di proseguire. Non vedo la necessità di parallelizzare.

    Nel caso in cui tu debba per forza lavorare con due thread, sui singoli elementi devi sincronizzare sicuramente i set e probabilmente i get, ma devi valutare anche tutti gli altri metodi della classe. Potrebbe anche essere necessario sincronizzare gli accessi alla ArrayList: il secondo thread potrebbe star lavorando su elementi già rimossi oppure non vedere elementi appena aggiunti...

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    20
    Grazie per la risposta.
    Comunque il primo thread non deve attendere il secondo. Perchè il primo può continuare a lavorare indipendentemente dal secondo (generalmente per ogni iterazione del secondo, il primo ne fa 3-4).

    Il secondo thread lavorerà sugli elementi del vettore memorizzati dal primo thread:
    - il primo thread memorizza in una variabile membro array
    - il secondo si fa un copia locale degli elementi del vettore del primo thread (per copia intendo stesso reference, no un nuovo oggetto con lo stesso stato), modificando il contenuto dell'oggetto (non aggiunge/rimuove nessun oggetto dal vettore membro del primo thread).

    Quindi di fatto sia il primo che il secondo thread lavoreranno sugli stessi oggetti (ma ci sono due reference). Quindi se il primo thread cancella un elemento (quindi cancella un reference), il secondo agirà sull'unico reference rimasto. Al termine dell'esecuzione del passo del thread, il reference sarà perso e quindi quell'oggetto passerà nelle mani del garbage.
    Quindi basta gestire solo l'accesso ai membri del singolo oggetto nel vettore, non c'è da gestire le operazioni sul vettore (tipo add/remove).

    Giusto o mi sbaglio?
    grazie

  4. #4
    in java si passano sempre per valore, ma i valori sono gli indirizzi degli oggetti. Quindi, a meno che tu non esegui una .clone() esplicita, avrai sempre in ogni struttura dati il riferimento all'unico e solo oggetto.
    alla fine dei lavori, se perdi i riferimenti nell'arraylist e gli oggetti non sono più raggiungibili dai due thread, allora il garbage collector provvederà ad eliminarli.

    Per sapere se verranno eliminati, basta che ti poni questa domanda. Posso io a questo punto del thread recuperare questi oggetti? se la risposta è no, il garbage collector ci lavorerà su....prima o poi. Se il tuo problema è la memoria, ricordati che puoi forzare l'esecuzione del garbage collector, dalla System mi pare... boh
    ...

  5. #5
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Sì, credo che la domanda fosse sulle operazioni di sincronizzazione, non sul funzionamento del garbage collector... comunque le chiamate a System.gc() - o all'equivalente Runtime.gc() - andrebbero evitate, la JVM è ottimizzata per effettuare da sola le chiamate al momento giusto... comunque, non era questo il punto.

    Ho capito il funzionamento ad alto livello del tuo programma, Promo... ti devo segnalare, però, che da documentazione la classe ArrayList NON è sincronizzata: quindi è possibile che se il primo thread aggiunge/toglie elementi mentre il secondo sta effettuando la copia dei reference potresti andare incontro a inconsistenze. Ti consiglio fortemente quindi di sincronizzare anche gli accessi alla ArrayList

  6. #6
    in questo caso....
    C'è java.util.concurrent.* che hanno molte classi che ti potranno essere utili.
    Ad esempio LinkedBlockingQueue è una lista che ha put e take, entrambi sono bloccanti e sincronizzate. Take prende un elemento dalla lista se è disponibile, altrimenti aspetta. E' un esempio, ma sicuramente ne puoi trovare qualcuno che fa al caso tuo.
    ...

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.