anch'io ho avuto di questi problemi, ho risolto però con i metodi obsoleti, deprecati, fuori moda ecc... di Thread: suspend() resume().

questa è la classe che incrementa la progress

codice:
public class Status extends Thread {
	private JProgressBar j;
	int space = 0;
	
	Status(JProgressBar j) {
		this.j = j;
		start();
	}
public void run() {
		space += 20;
		j.setValue(space);
		this.suspend();
		space += 20;
		j.setValue(space);
		this.suspend();
		space += 20;
		j.setValue(space);
		this.suspend();
		space += 20;
		j.setValue(space);
		this.suspend();
		space += 20;
		j.setValue(space);
	}

}
poi ho creato l'altro thread che faceva quello che doveva fare, e la JDialog che contiene la progress, viene passata alla classe sopradetta creandone un instanza, e quando voglio che venga incrementata faccio
codice:
istanzaStatus.resume();
io mi sono arrangiato però in un modo schifoso dato che mi bastava che alla fine funzionasse, inoltre con questo codice devi sapere già in che punti incrementare la bar, di quanto, e quante volte.

Per sistemi più puliti rimando a qualcuno che abbia più esperienza di multithred e l'utilizzo di wait() e notify()