2010-05-24 15 views
7

Ho sviluppato un'applicazione Java Swing che utilizza la classe SwingWorker per eseguire alcune attività a esecuzione prolungata. Quando l'applicazione viene eseguita dall'IDE (Netbeans), posso avviare più attività a esecuzione prolungata contemporaneamente senza alcun problema.Come risolvere il problema Java con più thread durante l'esecuzione con un file jar eseguibile?

Ho creato un file jar eseguibile per l'applicazione, per poterlo eseguire dall'esterno dell'IDE. L'applicazione eseguita da questo file jar funziona bene con l'unica eccezione che non mi consente di avviare contemporaneamente 2 attività a esecuzione prolungata. I compiti vengono eseguiti uno dopo l'altro.

Sono riuscito a creare un programma molto semplice che dimostra questo problema. link Il programma utilizza un oscillatore che scorre da 1 a 100 e scrive il numero sulla console. I due pulsanti avviano due thread che fanno la stessa cosa. Se eseguo questo programma su netbeans, i thread si alternano, mentre se creo un file jar ed eseguo l'applicazione dal file jar, i thread non si intrecciano, ma si eseguono uno dopo l'altro.

Sembra che jvm non consenta l'esecuzione di più di un thread in qualsiasi momento, quando l'applicazione viene eseguita dal file jar.

Ecco il codice per quelli di voi che hanno problemi con il link

package testingjarpath; 

import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.List; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import javax.swing.SwingWorker; 

public class Main extends JFrame { 
    private JButton btnTest; 
    private JButton btnTest2; 

    public Main() { 

     this.btnTest = new JButton("Test 1"); 
     this.btnTest.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       new Main.MyTask("First").execute(); 
      } 
     }); 

     this.btnTest2 = new JButton("Test 2"); 
     this.btnTest2.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       new Main.MyTask("Second").execute(); 
      } 
     }); 

     this.setLayout(new FlowLayout()); 
     this.add(this.btnTest); 
     this.add(this.btnTest2); 
     this.setSize(new Dimension(400, 400)); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Main(); 
      } 
     }); 
    } 

    public class MyTask extends SwingWorker<Void, Integer> { 
     private String str; 

     public MyTask(String str) { 
      this.str = str; 
     } 

     @Override 
     protected Void doInBackground() throws Exception { 
      for (int i = 0; i < 100; i++) { 
       Thread.sleep(100); 
       publish(i); 
      } 
      return null; 
     } 

     protected void process(List<Integer> progress) { 
      System.out.println(str + " " + progress.get(progress.size() - 1)); 
     } 

     @Override 
     protected void done() { 
      System.out.println(str + " is ready"); 
     } 

    } 

} 

Grazie in anticipo, Peter Bartolo

+1

Mostrarci del codice potrebbe aiutarci ad aiutarvi – karoberts

+0

sì, ho postato un programma molto semplice che dimostra il problema –

+0

Qualcuno è riuscito a replicare il problema sulla sua macchina? –

risposta

4

A quanto pare, SwingWorker s per impostazione predefinita tutte esecuzione sullo stesso thread in background in JDK 1,6

Aggiungere questi

import java.util.concurrent.Executor; 
import java.util.concurrent.Executors; 

Nella parte superiore del vostro Main() aggiungere questo

final Executor executor = Executors.newCachedThreadPool(); 

e nel tuo actionPerformed s, eseguire i vostri SwingWorker s come questo

executor.execute(new Main.MyTask("First")); 

Questo eseguirà ogni SwingWorker su un thread separato in un pool di thread.

+0

Mille Grazie m8, ora funziona :) –

+0

Contento di aver potuto aiutare – karoberts

Problemi correlati