Como faço para o java esperar um determinado tempo para executar uma determinada função?

bom dia, tenho o seguinte código:

[code]public NewClass() {public void imprimeDocumentos(int Talao) {
Connection con = new ConexaoBD().conexao();
HashMap hm = new HashMap();
hm.put(“Talao”, Talao);
JasperPrint jp;
try {
jp = JasperFillManager.fillReport(c.getRecibo_jasper(), hm, con);
JasperExportManager.exportReportToPdfFile(jp, c.getRecibo_pasta() + String.valueOf(Talao) + “.pdf”);
} catch (JRException ex) {
JOptionPane.showMessageDialog(null, ex);
}

    File f = new File(c.getRecibo_pasta() + String.valueOf(Talao) + ".pdf");
    Desktop d = Desktop.getDesktop();
    try {
        d.open(f);
    } catch (IOException ex) {
        JOptionPane.showMessageDialog(null, ex);
    }
    try {
        jp = JasperFillManager.fillReport(c.getControleinterno_jasper(), hm, con);
        JasperExportManager.exportReportToPdfFile(jp, c.getControleinterno_pasta() + String.valueOf(Talao) + ".pdf");
    } catch (JRException ex) {
        JOptionPane.showMessageDialog(null, ex);
    }

    f = new File(c.getControleinterno_pasta() + String.valueOf(Talao) + ".pdf");
    d = Desktop.getDesktop();
    try {
        d.open(f);
    } catch (IOException ex) {
        JOptionPane.showMessageDialog(null, ex);
    }
}[/code]

agora o seguinte, tenho alguns dados para mostrar no relatório, então eu exporto para PDF e abro o arquivo, só que o java faz tão rápido que não dá tempo de exportar todos os dados para o pdf, daí quando o java abre o pdf ele abre incompleto, então eu fecho o pdf e abro direto no arquivo e abre o pdf completo, gostaria então de fazer com que após a exportação do arquivo o java esperasse 1 ou 2 segundos no máximo para concluir a exportação . . .

como eu faria isso?

vlw galera . . .

Só está bem estranho isso, tão rápido que não dá tempo de popular. Bom, não tenho como analisar a fundo agora o seu código, mas tu pode dar um Thread.sleep(3000) para aguardar os três segundos de processamento. Só digo, se o processo de preenchimento levar 4 segundos, como fica ? Supondo que venham muitos dados ou qualquer outro motivo que ocasione o atraso.

Dá uma revisada no seu código com calma, porque eu usei isso em Servlet e após a exportação já mandava imprimir em tela e nunca tive esse problema.

Use um timer…
voce configura ele, que apos a um tempo determinado por voce ele executa essa função

exemplo: executar função apos 5 segundos…

baixe o compenente TIMERBEAN.jar
http://www.4shared.com/file/6gwLJl5Z/TimerBean.html

Insira ele, no seu projeto, va na propriedade value algo desse tipo…

ao chamar a função que abre o seu comando;

coloque nomeTimerBean.start();

ai ele vai executar o comando que esta dentro do timer apos o segundo que vc configurar

1000 - equivale a 1segundo

[code]public void meuTimer(){
//bloco de comando

meuTimer.stop; // executa uma vez o comando e depois desativa o timer… senao seria um loop infinito;
}[/code]

Esta equivale a uma parada de 1 segundo.

new Thread().sleep(1000);

Cara… tem algo errado ai…

Timer ou espera não é a solução para o seu problema…
Parece que tem algo ficando em memória… falta algum flush… não sei… faço isso que você fez direto em desktop e web e nunca tive problemas…

Qual versão do jasper esta usando?

[quote=jmmenezes]Cara… tem algo errado ai…

Timer ou espera não é a solução para o seu problema…
Parece que tem algo ficando em memória… falta algum flush… não sei… faço isso que você fez direto em desktop e web e nunca tive problemas…

Qual versão do jasper esta usando?
[/quote]

Eu também sinto cheiro de algo errado, só estou sem tempo de analisar o código dele. E claro, só estamos vendo essa classe, não sabemos de todo o resto.

Cara, não precisa usar TIMER nisso ai, apenas uma Thread.

new Thread().sleep(1000);  

Isso vai atrasar o evento em um segundo.

Independente de utilizar Thread.sleep, Timer ou qualquer outra função que pause por um X tempo o processamento, acredito que essa não seja a solução adequada para seu problema.

Procure o erro no seu código, em algum momento você deve estar utilizando a API de forma errada.

A solução de pausar o processamento pode trazer mais problemas no futuro…

Abraços!

Cara Usar o Therd.sleep ou qualquer outro recurso para pausar o processo por w tempo não é recomendado o ideal seria você criar o seu thread ou criar usar o AsyncTask que e bastante simples e resolve o seu problema de uma forma bem pratica um exemplo

public class ShopServices extends AsyncTask<Integer, Double, String>

@Override
protected void onPreExecute() {
// aqui vc define a ação que deve ocorre antes que a tread seja iniciada no meu caso mostra um cx de dialogo para esperar

          showDialog = ProgressDialog.show(context, context.getResources()
			.getString(R.string.DialogDownloadTitle), context
			.getResources().getString(R.string.DialogDownloadText), true,
			true);

}

@Override
protected String doInBackground(Integer... params) {
 // Aqui vc coloca o seu codigo com ação que vc quer executar no mesu caso estou o download das info que tenho um DB 
	dao = new ShoppenDAO(context);
	final String DOWNLOAD_LIST = "ListShoppen" + System.currentTimeMillis()
			+ ".txt";
	File sdCardPath = Environment.getExternalStorageDirectory();
	File directory = new File(sdCardPath.getAbsolutePath() + "/ShoppenList");
	directory.mkdirs();

	try {
		File file = new File(directory, DOWNLOAD_LIST);
		FileOutputStream output = new FileOutputStream(file);
		OutputStreamWriter writer = new OutputStreamWriter(output);

		for (Shoppens lojas : dao.getLista()) {
			writer.write(lojas.toString() + "\n");
		}

		writer.close();
		output.close();
		dao.close();

	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}

	return null;
}

@Override
protected void onPostExecute(String result) {

// e quai e colocada o que deve ser executado apois o termino da execução do thread no meu caso eu to fechando a cx de dialogo e enciando um
// notificação para o usuario caso esteha ativado,
// No seja no seu caso qui vc manda abrir o o pdf pois vai estar garantido que ele so vai abrir depois que tiver sido completamente escrito

          if (MainActivity.getNotef().equals("true")) {
		MainActivity.setNotification();
	}
	
	showDialog.dismiss();

}

ps isso esta rodando em uma classe separada que e chamada na minha classe principal da seguinte no button que eu quero que execute o download

      ShopServices downloadBg = new ShopServices(this);
  downloadBg.execute();

espero que ajude