JProgressBar Thread

Olá. Estou com uma dúvida sobre Threads em java. Na verdade eu entendi na teoria o funcionamento das threads, os métods .wait() .sleep() .notify() etc… O problema é que não sei implementa-los na prática. Criei um exemplo simples, que possuí o mesmo problema que a aplicação que eu quero desenvolver.
Basicamente o problema é eu quero implementar uma barra de progresso ao programa, No caso ela fica na própria aplicação(não vem em uma janela de fora para exibir a porcentagem), só que o incrementador da barra não fica na mesma classe que a barra… ela é passada como parâmetro para outra classe que fará um processamento e deve retornar aos poucos o progresso desse processamento.


public class LoadBar extends javax.swing.JFrame{
private JProgressBar jProgressBar1;
private JLabel jPercent;
private JButton jButGo;
private JLabel jLabelProgress;
private Loader load = new Loader();

{
	//Set Look & Feel
	try {
		javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
	} catch(Exception e) {
		e.printStackTrace();
	}
}


/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
	SwingUtilities.invokeLater(new Runnable() {
		public void run() {
			LoadBar inst = new LoadBar();
			inst.setLocationRelativeTo(null);
			inst.setVisible(true);
		}
	});
}

public LoadBar() {
	super();
	initGUI();
}

private void initGUI() {
	try {
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		getContentPane().setLayout(null);
		{
			jProgressBar1 = new JProgressBar();
			getContentPane().add(jProgressBar1);
			jProgressBar1.setBounds(22, 63, 220, 21);
			jProgressBar1.setMinimum(1);
			jProgressBar1.setMaximum(100);
			jProgressBar1.setValue(1);
		}
		{
			jLabelProgress = new JLabel();
			getContentPane().add(jLabelProgress);
			jLabelProgress.setText("Progress");
			jLabelProgress.setBounds(22, 43, 50, 14);
		}
		{
			jPercent = new JLabel();
			getContentPane().add(jPercent);
			jPercent.setText("0 % done");
			jPercent.setBounds(248, 70, 62, 14);
		}
		{
			jButGo = new JButton();
			getContentPane().add(jButGo);
			jButGo.setText("Load");
			jButGo.setBounds(117, 101, 55, 23);
			jButGo.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent evt) {
					try {
						jButGoActionPerformed(evt);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			});
		}
		pack();
		this.setSize(336, 189);
	} catch (Exception e) {
	    //add your error handling code here
		e.printStackTrace();
	}
}

public void carregar() throws InterruptedException{
	load.carregar(jProgressBar1, jPercent);
}

private void jButGoActionPerformed(ActionEvent evt) throws InterruptedException {
	carregar();
}

}


public class Loader extends Thread {

public void carregar(JProgressBar pb, JLabel label) throws InterruptedException {
	for (int i = 1; i <= 100; i++) {
		sleep(100);
		pb.setValue(i);
		label.setText(i+"% done");
	}
}

}


public class main {

public static void main(String[] args) throws InterruptedException{
	LoadBar lb = new LoadBar();
	lb.setVisible(true);
	lb.setLocationRelativeTo(null);		
}

}

Então a main, executa a janela de carga, que consiste apenas em uma janela com uma barra de carregamento e um botão para iniciar o processo de carga. Um outro objeto ira fazer um processamento e aos poucos ele deve indicar à barra quantos % da tarefa ele já resolveu. E a barra deve ser atualizada nesse período. Só que a barra não atualiza. Ela espera até o método terminar todo o processo, para daí sim, atualizar a barra. então ela vai de 0% para 100% e não de 0% à 100%

O que eu devo fazer? Obrigado.

Se quiser implementar Threads em Swing da maneira correta, estude a classe SwingWorker.