Na verdade, é o outro processo que deve estar numa thread.
A progress bar responde a eventos do Swing, que são processados na Thread da AWT.
Sempre que um botão é clicado, o código dos listeners é executado dentro dessa thread. Então, se esse código for lento demais, você vai notar que a aplicação congela, mostra telas em cinza, etc.
Para resolver esse problema, basta mover o código demorado para outra thread e, de lá, apenas mandar mensagens para os componentes se atualizarem. Assim a thread da AWT continuará processando eventos, seu trabalho será feito em outro lugar e seu progress bar será pintado normalmente.
A menos que o componente seja Thread-safe, é necessário que essas mensagens sejam enviadas para a fila da AWT, da seguinte forma:
EventQueue.invokeLater(new Runnable() {
public void run() {
barraDeProgresso.setValue(2);
}
}
Geralmente, os eventos thread-safe contém o seguinte texto em seu Java doc:
This method is thread safe, although most Swing methods are not. Please see Threads and Swing for more information.
Sobre esse assunto, vale a pena consultar:
Lesson: Concurrency in Swing da própria Sun. Aqui ele fala também da classe SwingWorker, que facilita esse trabalho de multi-threading e Swing.