Sincronizzazione tre 2 thread

di il
4 risposte

Sincronizzazione tre 2 thread

Ciao a tutti

avrei bisogno di sincronizzare 2 thread, uno dei quali è DAEMON ( setDaemon(true) ). Spiego meglio il problema.
Il thread principale crea un interfaccia grafica che visualizza delle immagini, che possono essere cambiate in base ai pulsanti premuti. Le immagini sono scaricate direttamente da un sito web e tramite overraide di paint scritte su un pannello. (FIN QUA NESSUN PROBLEMA).
Il thread DAEMON ha il compito di effettuare un update dell'immagine ogni ora. (cosa banale anche essa).
IL PROBLEMA È QUESTO:
se pigio un pulsante nell'istante di tempo in cui il thread DAEMON sta effettuando l'aggiornamento mi compaiono due pannelli.Ovvio che il problema è nella sincronizzazione della sezione critica. Ora essendo nuovo, e assolutamente AUTODIDATTA, di JAVA non so da che punto partire per effettuare la sincronizzazione.
Qualcuno può darmi un suggerimento?

GRAZIE MILLE

4 Risposte

  • Re: Sincronizzazione tre 2 thread

    Il metodo o la variabile istanza usati dai due thread per aggiornare l'immagine devono essere dichiarati con la parola chiave " synchronized" cioè:


    public synchronized void AggiornaImmagine()
    {
    ...
    ...
    ...
    }

    oppure nel caso di variabile istanza

    synchronized(this.variabileistanza);
  • Re: Sincronizzazione tre 2 thread

    Ciao provo ad aiutarti con un esempio, ti posto il codice di alcune classi che realizzano una comunicazione da tra due thread. In pratica abbiamo una classe principale che avvia due thread.La struttura condivisa è un'istanza della classe basket, la simulazione è questa: un thread mette simbolicamente una palla nel basket, poi attende la notifica dall'altro Thread che deve toglierla dal basket, quest'ultimo la toglie dal basket e poi notifica il primo che quindi ne mette una nuova e cosi via.. fino al momento in cui il MAIN invia i segnali di interruzione ai due thread. Il tutto poggia su blocchi synchronized a livello di oggetto, wait(),notify() ed interrupt.

    La classe che modella la struttura condivisa:
    public class Basket {

    private boolean empty=true;

    public boolean isEmpty() {
    return empty;
    }

    public void setEmpty(boolean empty) {
    this.empty = empty;
    }

    }
    Il thread che inserisce:
    public class Push extends Thread{

    private final Basket basket;

    public Push(Basket basket){
    this.basket = basket;
    }

    @Override
    public void run(){

    while(!isInterrupted()) {

    synchronized(basket){
    if(basket.isEmpty()) {
    basket.setEmpty(false);
    System.out.println("PUSH: ball in the basket,ok");
    }
    basket.notifyAll();

    try {
    basket.wait();
    } catch (InterruptedException ex) {
    /* L'eccezione cancella lo stato di interrupt
    * se si è verificata come thread devo comunque
    * terminare
    */
    interrupt();
    }

    }

    }
    System.out.println("PUSH: interrupted");

    }

    }
    Il thread che estrae:
    public class Pull extends Thread {

    private final Basket basket;

    public Pull(Basket basket){
    this.basket = basket;
    }

    @Override
    public void run(){

    while(!isInterrupted()) {

    synchronized(basket){

    if(!basket.isEmpty()){
    basket.setEmpty(true);
    System.out.println("PULL: ball from the basket,ok");
    }

    basket.notifyAll();

    try {
    basket.wait();
    } catch (InterruptedException ex) {

    if(!basket.isEmpty()){
    basket.setEmpty(true);
    System.out.println("PULL: ball from the basket,ok");
    }
    /* L'eccezione cancella lo stato di interrupt
    * se si è verificata come thread devo comunque
    * terminare
    */
    interrupt();
    }
    }
    }
    System.out.println("PULL: interrupted");
    }
    }

    L'applicazione per la imulazione:
    public class BasketDemo {

    public static void main(String[] args){

    Basket basket = new Basket();

    Pull pull = new Pull(basket);
    Push push = new Push(basket);

    pull.start();
    push.start();
    try {
    Thread.currentThread().sleep(10);
    } catch (InterruptedException ex) {
    ex.printStackTrace();
    }
    pull.interrupt();
    push.interrupt();
    try {
    pull.join();
    push.join();
    } catch (InterruptedException ex) {
    ex.printStackTrace();
    }
    }
    }
    dovresti avere una stampa simile a questa:

    PUSH: ball in the basket,ok
    PULL: ball from the basket,ok
    PUSH: ball in the basket,ok
    PULL: ball from the basket,ok
    PUSH: ball in the basket,ok
    PULL: ball from the basket,ok
    .....
    .....
    PULL: interrupted
    PUSH: interrupted

    spero di esserti stato di aiuto.
  • Re: Sincronizzazione tre 2 thread

    Grazie mille ad entrambi...
    Mi può essere molto di aiuto...Mi manca da capire però:
    uno dei due thread si dovrebbe bloccare quando invoco un ActionListener...come a gestire ciò?
    Devo mettere all'interno del thread l'actionListener oppure come devo fare?

    GRAZIE
  • Re: Sincronizzazione tre 2 thread

    Non ho capito bene il tuo dubbio. Nel momento che uno dei due thread accede ad un metodo o istanza dichiarata synchronized , avrà accesso esclusivo ad esso per la durata dell'operazione .
Devi accedere o registrarti per scrivere nel forum
4 risposte