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

    A cosa server il metodo invokeLater di SwingUtilities?

    Salve. Allora, dal mio libro sto studiando il multithreading (ci sto capendo ben poco con Lock e Condition), e non riesco a capire a cosa serve invokeLater... ho questo programma, mi funziona bene sia usando questo metodo, sia senza... perchè usarlo allora?

    codice:
    import java.util.Random;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import javax.swing.JLabel;
    import javax.swing.SwingUtilities;
    import java.awt.Color;
    
    public class RunnableObject implements Runnable
    {
    	private static Random generator = new Random();
    	private Lock lockObject;
    	private Condition suspend;
    	private boolean suspended = false;
    	private JLabel output;
    	
    	public RunnableObject (Lock theLock, JLabel label)
    	{
    		lockObject = theLock;
    		suspend = lockObject.newCondition();
    		output = label;
    	}
    	
    	public void run()
    	{
    		final String threadName = Thread.currentThread().getName();
    		
    		while (true)
    		{
    			try
    			{
    				Thread.sleep (generator.nextInt (1000));
    				
    				lockObject.lock();
    				try
    				{
    					while (suspended)
    					{
    						suspend.await();
    					}
    				}
    				finally
    				{
    					lockObject.unlock();
    				}
    			}
    			catch (InterruptedException exception)
    			{
    				exception.printStackTrace();
    			}
    			
    			SwingUtilities.invokeLater
    			(
    				new Runnable()
    				{
    					public void run()
    					{
    						char displayChar = (char) (generator.nextInt (26) + 65);
    						output.setText (threadName + ": " + displayChar);
    					}
    				}
    			);
    		}
    	}
    	
    	public void toggle()
    	{
    		suspended = !suspended;
    		
    		output.setBackground (suspended ? Color.RED : Color.GREEN);
    		
    		lockObject.lock();
    		try
    		{
    			if (!suspended)
    			{
    				suspend.signal();
    			}
    		}
    		finally
    		{
    			lockObject.unlock();
    		}
    	}
    }

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

    Re: A cosa server il metodo invokeLater di SwingUtilities?

    Originariamente inviato da Dreamer89
    ci sto capendo ben poco con Lock e Condition
    Sono argomenti abbastanza "avanzati".

    Originariamente inviato da Dreamer89
    non riesco a capire a cosa serve invokeLater
    Serve per far eseguire il codice del run() (del Runnable) nel contesto del EDT, event-dispatch-thread. L'architettura di Swing non è thread-safe. Salvo pochi casi peraltro ben documentati, agire sui componenti di una interfaccia utente Swing (settare proprietà di componenti, layout ecc...) va fatto solo nel contesto del EDT.

    Originariamente inviato da Dreamer89
    mi funziona bene sia usando questo metodo, sia senza... perchè usarlo allora?
    Perché se non lo usi sei in balia della "fortuna" ... potrebbe funzionare ma in presenza di tempistiche dei thread un pochino "sfortunate" potresti causare casini ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quindi se più thread devono interagire su più componenti Swing anche se non sono condivisi, bisogna usare il metodo invokeLater per evitare eventuali problemi di gestione?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Dreamer89
    Quindi se più thread devono interagire su più componenti Swing anche se non sono condivisi, bisogna usare il metodo invokeLater per evitare eventuali problemi di gestione?
    Sì, esatto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Originariamente inviato da andbin
    Sì, esatto.
    Grazie mille

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.