Pausa dentro do TIMER

Pessoal, preciso que dentro da função run() do meu Timer haja uma pausa de tempo em segundos, que um método que já criei informará ao programa quando precisar. Porém não sei que comando utilizar para fazer essa pausa.

Tentei o Thread.sleep(tempo); mas o programa trava todinho por aquele tempo e não é isso que eu quero.

O programa simula uma fila de impressão de 4 micros, o sistema joga os documentos na fila e automaticamente o timer comanda a remoção dos documentos. Porém, os documentos devem sair com tempo proporcional ao seu tamanho. E o tamanho é gerado aleatoriamente no ato da inserção do documento na fila.

Tudo está pronto, mas não consigo fazer esse tempo proporcional.

O Timer já tem um tempo de delay especificado por mim (5000ms), mas tentei inserir no lugar do delay a chamada do método que retorna o tamanho do arquivo (que pode ser usado como tempo em ms). Entretanto, o Timer pega o tempo de delay do primeiro elemento da fila e usa esse mesmo delay para todos os demais. Quando na verdade deveria ter um delay diferente para cada elemento, de acordo com o tamanho do arquivo na fila, que é uma variável do tipo int.

Alguém poderia me ajudar, por favor?

Se tu postar o código fica mais fácil.

//TIMER DA REMOÇÃO DE DOCUMENTOS
Timer timer;
timer = new Timer();
timer.schedule(spool,Long.parseLong(spool.getTamanho()),1000);

E o método run() que contém o que deve ser feito:

//MÉTODO PARA O TIMER PARA REMOÇÃO DE ELEMENTOS AUTOMÁTICA DA FILA DE IMPRESSÃO
public void run() {
     Remover_Elemento();
}

É o Thread.sleep mesmo. Mas isso deve ser feito na thread do timer. Você está usando uma thread separada para o timer, não está?

Ou está usando o timer do swing? Ou do java.util?

Como crio essa Thread?
Estou usando o Timer do java.util…
O outro do swing seria melhor?

Eu acho que desse jeito você tá dando um sleep na "impressora e nçao nos documentos.

Tenta fazer um construtor na Thread Timer pra ela receber o tempo e ela ficar encarregada de parar durante aquele tempo…
Ou seja coloque o sleep dentro da Classe Timer.

Eu fiz isso, mas o sleep quer onde ele esteja faz o programa todinho travar durante aqueles segundos. O usuário não pode apertar nenhum botão, não pode fazer mais nada, o programa “dorme” por alguns segundos.
Não existe algo que não trave desse jeito?

Tenta o

this.wait(tempo em milisegundos)//dentro da thread

ou

timer.wait(tempo em milisegundos)

ao invés do sleep

Como deveria ficar isso? Assim?

    public void run() {
        try {
            this.wait(5000);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        Remover_Elemento();
    }

Se for isso mesmo está dando um erro e não está funcionando o timer:

[color=red]Exception in thread “Timer-0” java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at filadeimpressao.Fila.run(Fila.java:119)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)[/color]

com o sleep deveria funcionar provávelmente existe erros na lógica do teu programa, posta ele completo (se não for muito grande) ou debuga com uma ide tipo eclipse ou netbeans.

Ai vai um exemplo de um run com sllep que eu fiz a tempo atrás:

public void run(){
		Pessoa aux;
		
		while (true){
			try { Parque.SemaforoDoBrinquedo[tipoDeBrinquedo].acquire();} catch(Exception e){}
			if (Parque.filasDosBrinquedos[tipoDeBrinquedo].size() >= capacidadeDePessoas){	        
				
				for (int i=0; i<capacidadeDePessoas; i++){
					pessoasNoMeuBrinquedo.add(Parque.filasDosBrinquedos[tipoDeBrinquedo].get(0));
					Parque.filasDosBrinquedos[tipoDeBrinquedo].remove(0);
				}
				Parque.arrumaAFilaNoMenu(Parque.filasDosBrinquedos[tipoDeBrinquedo], 2, tipoDeBrinquedo);
				
				Parque.SemaforoDoBrinquedo[tipoDeBrinquedo].release();
				
				Parque.arrumaAFilaNoMenu(pessoasNoMeuBrinquedo, 3, tipoDeBrinquedo);
				
				switch (tipoDeBrinquedo){
					case 0: InterfaceComUsuario.jLabel13.setText("BRINQUEDO CHEIO"); break;
					case 1: InterfaceComUsuario.jLabel28.setText("BRINQUEDO CHEIO"); break;
					case 2: InterfaceComUsuario.jLabel27.setText("BRINQUEDO CHEIO"); break;
					case 3: InterfaceComUsuario.jLabel26.setText("BRINQUEDO CHEIO"); break;
				}
				
				try { sleep(5000);} catch(Exception e){}
				pessoasNoMeuBrinquedo.clear();
				Parque.arrumaAFilaNoMenu(pessoasNoMeuBrinquedo, 3, tipoDeBrinquedo);
				
				switch (tipoDeBrinquedo){
				case 0: InterfaceComUsuario.jLabel13.setText("PARADO"); break;
				case 1: InterfaceComUsuario.jLabel28.setText("PARADO"); break;
				case 2: InterfaceComUsuario.jLabel27.setText("PARADO"); break;
				case 3: InterfaceComUsuario.jLabel26.setText("PARADO"); break;
				}
				
				tempoDeEsperaDaFila = System.currentTimeMillis();
	        }
			else if((System.currentTimeMillis() - tempoDeEsperaDaFila) >= 10000  && !Parque.filasDosBrinquedos[tipoDeBrinquedo].isEmpty()){
				
				pessoasNoMeuBrinquedo.addAll(Parque.filasDosBrinquedos[tipoDeBrinquedo]);
				Parque.filasDosBrinquedos[tipoDeBrinquedo].clear();
				Parque.arrumaAFilaNoMenu(Parque.filasDosBrinquedos[tipoDeBrinquedo], 2, tipoDeBrinquedo);
				
				Parque.SemaforoDoBrinquedo[tipoDeBrinquedo].release();
				
				Parque.arrumaAFilaNoMenu(pessoasNoMeuBrinquedo, 3, tipoDeBrinquedo);				
				
				switch (tipoDeBrinquedo){
				case 0: InterfaceComUsuario.jLabel13.setText("FUNCIONANDO POR TEMPO"); break;
				case 1: InterfaceComUsuario.jLabel28.setText("FUNCIONANDO POR TEMPO"); break;
				case 2: InterfaceComUsuario.jLabel27.setText("FUNCIONANDO POR TEMPO"); break;
				case 3: InterfaceComUsuario.jLabel26.setText("FUNCIONANDO POR TEMPO"); break;
				}
				
				try { sleep(5000);} catch(Exception e){}
				pessoasNoMeuBrinquedo.clear();
				Parque.arrumaAFilaNoMenu(pessoasNoMeuBrinquedo, 3, tipoDeBrinquedo);
				
				switch (tipoDeBrinquedo){
				case 0: InterfaceComUsuario.jLabel13.setText("PARADO"); break;
				case 1: InterfaceComUsuario.jLabel28.setText("PARADO"); break;
				case 2: InterfaceComUsuario.jLabel27.setText("PARADO"); break;
				case 3: InterfaceComUsuario.jLabel26.setText("PARADO"); break;
				}
				
				tempoDeEsperaDaFila = System.currentTimeMillis();				
			}
			else Parque.SemaforoDoBrinquedo[tipoDeBrinquedo].release();
			
			try { sleep(Parque.SleepDosBrinquedos[tipoDeBrinquedo]);} catch(Exception e){}
		}
	}

Tente usando outra thread. Dá uma olhada nos últimos 3 posts do tópico:
http://www.guj.com.br/posts/list/52964.java