Impressão Java

Boa noite galera!

to com um problema aki pra impressão, acontece o seguinte, desenvolvi um sistema, e qnd preciso q ele busque as impressoras ele demora muito,e os clientes estão reclamando…, não é questão de maquina, pois o sistema está rodando em uma maquina com 1.7 GHZ e 1,2 MB de RAM, é uma aplicação desktop swing + hibernate, vou postar parte do código:

Utilzo uma classe para gerar um metodo generico para impressão

public class Print  {

    
    private Book book = new Book();
    private PageFormat pageFormat = new PageFormat();
    private Paper paper = new Paper();
    private Printer page;

    public Print(){
    }

    public void addPage(Printer page){
        this.page = page;
        book.append(this.page, pageFormat);
    }

    public void imprimir(String jobName){
        // Setando configuracoes da pagina
        paper.setSize(page.getWidth(), page.getHeight());
        paper.setImageableArea(page.getX(), page.getY(), page.getWidth(), page.getHeight());
        pageFormat.setPaper(paper);
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        aset.add(OrientationRequested.PORTRAIT);
        aset.add(new Copies(1));
        aset.add(new JobName(jobName, null));

        PrinterJob pj = PrinterJob.getPrinterJob();
        pj.setPrintable(page);
        pj.setPageable(book);

        PrintService[] services = PrinterJob.lookupPrintServices();

        if (services.length > 0) {
            try {
                pj.setPrintService(services[0]);
                //pj.pageDialog(aset);
                if (pj.printDialog(aset)) {
                    pj.print(aset);
                }
            } catch (PrinterException pe) {
                System.err.println(pe);
            }
        }
    }
}

Utilizo uma interface para abstrção

public interface Printer extends Printable {

    public static double fatorConverMMPt = 2.834646D;

    public double getWidth();
    public double getHeight();
    public double getX();
    public double getY();
}

Para imprimir eu desenvolvi uma classe que implementa a interface Printer
utilizando o metodo:

public synchronized int print(Graphics g, PageFormat pf, int pageIndex){
}

Utilizo está Thread para imprimir:

Thread imprimir = new Thread(new Runnable(){
                public void run(){
                    Collection<Extrato> e = new ArrayList<Extrato>();
                    // Criando colecao de dados
                    for(int i=0;i<rows;i++){
                        String numCheque = String.valueOf((Long)tableCheques.getValueAt(i, 1));
                        String dataEmissao = (String)tableCheques.getValueAt(i, 0);
                        Float valorUtilizado = Formatter.formataValor((String)tableCheques.getValueAt(i, 3));
                        String lote = (String)tableCheques.getValueAt(i, 5);
                        String convenio = (String)tableCheques.getValueAt(i, 2);
                        e.add(new Extrato(numCheque,dataEmissao,valorUtilizado,lote,convenio));
                    }
                    Print print = new Print();
                    print.addPage(new PrintExtrato(titular.getMatricula(),competencia.getText(),e));
                    print.imprimir("ExtratoIndividual");
                    defaultCursor();
                }
            });
waitCursor();
imprimir.start();

às vezes pra imprimir um extrato de uma 1 página apenas, demora quase 2 minutos para aparecer a caixa de dialogo da impressora, o q poderia ser? será q existe alguma solução?
Além disso os meus relatorio feitos com o jasper também demoram um pouco para serem gerados, eu utilizo os arquivos .jasper já compilados, e também qnd pede pra imprimir o relatorio demora muito pra encontrar as impressoras… seria um problema de máquina? valeu pela atenção.