Hola,
Cita:
Iniciado por pcarvajal
... lo mas simple posible ...
Eso está realmente difícil, el tema de los hilos es uno de los mas complicados en cualquier lenguaje, si quieres un ejemplo fácil para resolver el problema de Swing multithreading prueba con el vínculo que te mostré donde solamente utilizan el método invokeAndWait.
JavaDesigns-SwingMultithreading
Código Java:
Ver original public void run() {
label.setText("" + getPi());
}
});
Yo prefiero utilizar un método diferente, como por ejemplo:
Código Java:
Ver originalpackage org;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class JApp
extends JFrame {
private Threads Thread1, Thread2;
public JApp() {
initComponents();
}
private void initComponents() {
getContentPane
().
setLayout(new java.
awt.
FlowLayout()); getContentPane().add(jTextField1);
getContentPane().add(jTextField2);
@Override
if (Thread1.isPaused()) {
Thread1.resume();
} else {
Thread1.pause();
}
}
});
getContentPane().add(button);
pack();
Thread1 = new Threads(this);
Thread2 = new Threads(this);
}
@Override
super.paint(g);
jTextField1.
setText(String.
valueOf(Thread1.
get())); jTextField2.
setText(String.
valueOf(Thread2.
get())); }
@Override
public void dispose() {
Thread1.stop();
Thread2.stop();
super.dispose();
}
public static void main
(String args
[]) { @Override
public void run() {
new JApp().setVisible(true);
}
});
}
private class Threads
implements Runnable { private AtomicBoolean running = new AtomicBoolean(true);
private AtomicInteger value = new AtomicInteger(0);
private AtomicBoolean pause = new AtomicBoolean(false);
public Threads
(JFrame frame
) { this.frame = frame;
}
@Override
public void run() {
try {
while (running.get()) {
if (pause.get()) {
synchronized(this) {
wait();
}
}
value.set((int)(ThreadLocalRandom.current().nextInt(1000)));
frame.repaint();
}
}
}
public void stop() {
running.set(false);
if (isPaused()) resume();
}
public void pause() {
pause.set(true);
}
public boolean isPaused() {
return pause.get();
}
public void resume() {
pause.set(false);
synchronized(this) {
notify();
}
}
return value.get();
}
}
}
Pero es mucho más complicado de entender, cuando realizo una aplicación siempre pienso en que en un momento dado pueda ser que la tenga que mejorar, por ejemplo en esta aplicación no solo podrías mostrar un número sino enviar toda una estructura de datos de un hilo a otro, por supuesto con pequeñas modificaciones.
Saludos,