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étododoInBackground()
publish
process
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();
}
