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();
		}
	}
}