Olá a todos, estou tentando fazer uma pequena simulação de Fila de Impressão, se é que posso colocar dessa forma, e estou tendo um pequeno problema nesta parte final:
Na classe Printer, enquanto a fila de impressão estiver vazia, a impressora fica em espera, logo, quando estiver com algum arquivo, ela simplesmente da um println avisando que está imprimindo o arquivo.
Na classe Producer, ele monitora o que a impressora está fazendo, se ela estiver imprimindo algo, a Producer entra em espera, caso contrario, ela envia um arquivo para a fila de impressão, o que aciona a Printer novamente e assim sucessivamente.
Porém, como nunca utilizei os métodos wait() e notify(), estou tendo um pequeno problema com eles, e gostaria de saber a opinião de vocês a respeito do que eu posso fazer para corrigir este problema:
Classe Printer
public class Printer extends Thread {
long MILLIS_PER_PAGE = 500;
String nome;
CircularQueue queue;
Producer p;
public Printer(String name, CircularQueue cq) {
queue = cq;
nome = name;
System.out.println("[" + nome + "]: Ligando");
}
public synchronized void run() {
try {
while (true) {
//
while (queue.isEmpty()) {
System.out.println("[" + nome + "]: Esperando por trabalho de impressão...");
wait();
}
System.out.println("Imprimindo...");
Thread.sleep(MILLIS_PER_PAGE);
//
}
} catch (InterruptedException ex) {
System.out.println("Erro: " + ex);
}
}
public String getPrinterName() {
return nome;
}
public void halt() {
}
}
Classe Producer
import java.io.*;
public class Producer extends Thread {
String nome;
String file;
String split[];
CircularQueue queue;
/*Alterado a assinatura do metodo Producer para facilitar a manipulação de arquivos de texto*/
public Producer(String name, String arquivo, CircularQueue cq) {
nome = name;
file = arquivo;
queue = cq;
}
public Producer(String name, String arquivo) {
nome = name;
file = arquivo;
}
public String getProducerName() {
return nome;
}
public synchronized void run() {
try {
BufferedReader leitor = new BufferedReader(new FileReader(file));
String linha = leitor.readLine();
while (linha != null) {
while (!queue.isEmpty()) {
notify();
}
//processar a linha lida
split = linha.split("-");//divide o nome do arquivo do numero de paginas
/*Cria PrintJob*/
PrintJob pj = new PrintJob(split[0], Integer.parseInt(split[1])); //Cria um novo PrintJob
queue.addBack(pj);//adiciona PrintJob na Fila
/*Fim Criacao*/
System.out.println("#" + nome + "#: produzindo arquivo '" + split[0] + "', número de páginas " + split[1]);//Saida dos Producers
linha = leitor.readLine();//lê a proxima linha
Thread.sleep((int) (1 + (Math.random() * 5)) * 1000);//Tempo randomico entre 1 e 5 segundos para enviar um arquivo a Fila de Impressao
}
leitor.close();//fecha obj de leitura
System.out.println("Numero de Jobs: " + queue.getNumberOfJobs());
} catch (InterruptedException ex) {
System.out.println("Erro " + ex);//Falha de Sleep
} catch (FileNotFoundException ex) {
System.out.println("Erro " + ex);//Arquivo nao encontrado
} catch (IOException ex) {
System.out.println("Erro " + ex);//Erro na Leitura
}
}
}
Classe Main
public class PrinterApp {
public static void main(String[] args) throws Exception {
CircularQueue cq = new CircularQueue();
new Producer("Producer1", "arquivos_impressao.txt", cq).start();
new Printer("Printer",cq).start();
}
}
Agradeço antecipadamente qualquer ajuda.
Abraços,
Enrico