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
Mostrarci del codice potrebbe aiutarci ad aiutarvi – karoberts
sì, ho postato un programma molto semplice che dimostra il problema –
Qualcuno è riuscito a replicare il problema sulla sua macchina? –