Vamos por partes! 
Primeiramente:
Ou seja, ao usar o Runtime esta sendo criada uma nova Thread para executar o seu comando. O que você pode fazer, que inclusive excluiria a necessidade de usar barreira, é chamar o metodo waitFor() do Process que é retornado pelo metodo exec() de Runtime. Algo assim:
Process processo = r.getRuntime().exec("C:\\Arquivos de programas\\PostgreSQL\\8.1\\bin\\pg_dump.exe" +
" -i -h "+ endIPBanco +" -p 5432 -U "+ usuario + " -F c -b -v -f "+
caminhoDestino +" "+ baseDados +"");
processo.waitFor();
Do mais, é recomendável, ao invés de usar Runtime.getRuntime().exec(), usar a classe ProcessBuilder para criar processos. Assim, seu codigo ficaria assim:
ProcessBuilder builder = new ProcessBuilder("C:\\Arquivos de programas\\PostgreSQL\\8.1\\bin\\pg_dump.exe",
"-i", "-h" ,endIPBanco,"-p", "5432","-U", usuario, "-F","c","-b","-v","-f", caminhoDestino, baseDados);
Process processo = builder.start();
processo.waitFor();
Quanto ao segundo caso, eu não consigo imaginar agora porque funciona com um JFrame aberto e não funciona com outro. De toda forma usar uma barreira de “tamanho” 1 é no mínimo esquisito. A priori a barreira não serviria de nada, ja que ela esperaria apenas uma thread para liberar o fluxo, desta forma qualquer thread que chamasse o metodo await() seria logo liberada e não suspendida para esperar as demais threads.