Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Ogni tanto il programma si blocca

    Salve. Ho un problemino con il mio codice. Capita che ogni tanto si blocchi proprio alla sua terminazione. Il dubbio è che il problema sia legato ad un non corretto utilizzo dei threads.
    Quindi preliminarmente chiedo, è corretto fare questo in una classe Runnable?

    codice:
    synchronized void run() {
    	...
    	if(...) {
    		while(variabile == false) {
    			wait();
    		}
                    prosegui con le altre operazioni
    	}
    }
    
    synchronized void metodo() {
    	variabile = true;
    	notify();
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    In linea di principio direi di no, ma non è una risposta valida in generale.
    I blocchi synchronized sono pezzi di codice che devono essere invocati dai thread. Generalmente, quindi, i metodi di un thread non dovrebbero essere synchronized, anche perchè solitamente non ci sono altri thread che devono lavorare (in modo concorrente) con il thread in questione.

    Mi sa che, quindi, dovresti rivedere un attimino la logica che sottostà alla sincronizzazione di thread.

    Un thread/runnable A invoca un metodo di un'altra classe (che generalmente NON è un thread) che è synchronized quando deve concorrere con altri thread per l'accesso a quella parte di codice.

    I metodi del thread non dovrebbero essere synchronized perchè, generalmente, non ci sono più thread che devono invocarne i metodi in modo concorrente... per di più, l'invocazione di quel metodo non credo debba risvegliare nessuno, quindi non capisco chi vorresti notificare col notify()...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Il Runnable stesso che si mette in wait(), questa era l'idea. Quel metodo public è invocato dall'ascoltatore di un mio pulsante. Quando è il mio turno, il runnable è in attesa sulla wait(), premo il pulsante, la variabile cambia e invoco notify per uscire dalla wait. Capisco il tuo discorso comunque, però è strano perché generalmente il programma funziona. Il caso di blocco si verifica ogni tanto

  4. #4
    Ho provato a fare delle modifiche, senza ottenere nulla, nel senso che non va proprio.

    Ho aggiunto questa classe:

    codice:
    public class Wait {
    	
    	private boolean userHavePlayed;
    	
    	public Wait() {
    		userHavePlayed = false;
    	}
    	
    	public synchronized void setUserHavePlayed() {
    		userHavePlayed = true;
    		notifyAll();
    	}
    	
    	public boolean getUserHavePlayed() {
    		return userHavePlayed;
    	}
    	
    	public void setFalseUserHavePlayed() {
    		userHavePlayed = false;
    	}
    }
    Questo è l'ascoltatore del pulsante:

    codice:
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class DadoListener implements ActionListener {
    
    	private Wait wait;
    	
    	public DadoListener(Wait w) {
    		wait = w;
    	}
    	
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		wait.setUserHavePlayed();
    	}
    }
    E questo è la parte del run() importante:

    codice:
    while (wait.getUserHavePlayed() == false) {
    					try {
    						wait();
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    				wait.setFalseUserHavePlayed();
    Semplicemente alla pressione del bottone non accade nulla, come il run non si sbloccasse dalla wait()..

  5. #5
    Ok ho fatto un altro cambiamento ed ora funziona. Non mi rimane altro che provarlo n-mila volte e vedere se si blocca.

    Ho messo anche la wait() in un metodo synchronized dentro la classe Wait.

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.