Número máximo de SwingWorker threads

2 respostas
C

Olá pessoal,

alguém aí sabe qual o número máximo de SwingWorker threads que pode ser disparado? Fiz uma pequena aplicação para testar. Coloquei 20 JLabels (label1, label2, ..., label20)e um botão que dispara uma SwingWorker thread para cada label. O método
doInBackground()
da minha classe derivada da SwingWorker vai alterando o label. Para isso utilizei os métodos
publish
e
process
. O que acontece é o seguinte o botão dispara as threads para os 10 primeiros labels. As outras threads parecem ficar em uma fila e só começam a executar na medida que as outras vão terminando. O problema é que eu preciso que os 20 labels sejam alterados simultaneamente e não apenas 10 de cada vez. Alguém sabe uma solução para isso?

Minha classe:

public class MeaningOfLifeFinder extends SwingWorker<String, Integer> {
    private int id;
    private JLabel label;
    private Random r;
    
    MeaningOfLifeFinder(int i, JLabel mylabel) {
        long seed;
        id = i;
        label = mylabel;

        // Apenas inicializando o seed do random com valores chutados.
        if (i%2 == 0) {
            seed = (1433*i)+(32425/i)-(64214+(i*2));
        } else {
            seed = (2463/i)*i - (23*i);
        }
        r = new Random(seed);
    }

    @Override
    public String doInBackground() throws InterruptedException {
        return findTheMeaningOfLife();
    }
    
    @Override
    protected void done() {
        try { 
            label.setText(get()+id);
        } catch (Exception ignore) {
        }
    }
    
    String findTheMeaningOfLife() throws InterruptedException {
        Integer i;
                
        for (i = 0; i < 10; i++) {
            publish(i);  // Este valor vai para o label associado.
            Thread.sleep(r.nextInt(5000));
        }
        
        return "I found it! ";
    }

    
    // Isto sera executado na EDT Event Dispatch Thread
    @Override
    protected void process(List<Integer> list) {
        for(Integer k: list) {
            if (isCancelled()) {
                break;
            }
            label.setText(k.toString());
        }
    }

}

E o código que dispara as threads:

private void buttonActionPerformed(java.awt.event.ActionEvent evt) {                                       
// TODO add your handling code here:
    (new MeaningOfLifeFinder(1, label1)).execute();
    (new MeaningOfLifeFinder(2, label2)).execute();
    (new MeaningOfLifeFinder(3, label3)).execute();
    (new MeaningOfLifeFinder(4, label4)).execute();
    (new MeaningOfLifeFinder(5, label5)).execute();
    (new MeaningOfLifeFinder(6, label6)).execute();
    (new MeaningOfLifeFinder(7, label7)).execute();
    (new MeaningOfLifeFinder(8, label8)).execute();
    (new MeaningOfLifeFinder(9, label9)).execute();
    (new MeaningOfLifeFinder(10, label10)).execute();
    (new MeaningOfLifeFinder(11, label11)).execute();
    (new MeaningOfLifeFinder(12, label12)).execute();
    (new MeaningOfLifeFinder(13, label13)).execute();
    (new MeaningOfLifeFinder(14, label14)).execute();
    (new MeaningOfLifeFinder(15, label15)).execute();
    (new MeaningOfLifeFinder(16, label16)).execute();
    (new MeaningOfLifeFinder(17, label17)).execute();
    (new MeaningOfLifeFinder(18, label18)).execute();
    (new MeaningOfLifeFinder(19, label19)).execute();
    (new MeaningOfLifeFinder(20, label20)).execute();
    
}

2 Respostas

F

carloshiga:
O problema é que eu preciso que os 20 labels sejam alterados simultaneamente e não apenas 10 de cada vez.
Alguém sabe uma solução para isso?

Mesmo usando Thread a atualização vai ser sequencial! :wink:

No swing, tudo vai ser atualizado em uma thread, a EventDispatchThread, de modo sequencial

C

Resolvido:

// Passar o número máximo de threads a serem execultadas simultaneamente
ExecutorService threadPool = Executors.newFixedThreadPool(20);

threadPool.submit(new MeaningOfLifeFinder(label1));
threadPool.submit(new MeaningOfLifeFinder(label2));
threadPool.submit(new MeaningOfLifeFinder(label3));
// ... e assim por diante.
Criado 4 de julho de 2008
Ultima resposta 4 de jul. de 2008
Respostas 2
Participantes 2