/*
Ejemplo simple del uso de Runnable.
*/
package experimentos;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/**
*
* @author Rafael Angel Montero Fernández.
*/
public class RunnableMain {
public static void main(String m[])
{
Formulario_para_hilos frmHilos=new Formulario_para_hilos();
}//main
}//RunnableMain
abstract class MiRunnable implements Runnable
{
private int contador=0;
public abstract void ejecutando_hilos();
@Override
public void run()
{
this.ejecutando_hilos();
}//run
/**
* @return retorna el valor guardado en la variable contador.
*/
public int getContador() {
return contador;
}
/**
* @param nuevo_contador parametro de entrada de numeros.
*/
public void setContador(int nuevo_contador) {
this.contador = nuevo_contador;
}
}//MiRunnable
///////////////////////////////////////////////////////////////////////////////
@SuppressWarnings("serial")
class FormRunnable extends JFrame implements ActionListener
{
private JMenu jmArchivo=new JMenu("Archivo"), jmVer=new JMenu("Ver"), jmAcciones=new JMenu("Acciones");
private JMenuItem jmiSalir=new JMenuItem("Salir"), jmiComenzar=new JMenuItem("Comnenzar"), jmiDetener=new JMenuItem("Detener"), jmiRealizar_otra_tarea=new JMenuItem("Realizar otra tarea");
private JLabel jlDatos=new JLabel("Datos de los hilos.");
private JTextArea jtaDatos=new JTextArea();
private JScrollPane jspDatos;//=new JScrollPane();
private JMenuBar jmbBarra=new JMenuBar();
public FormRunnable()
{
super("Formulario abstracto.");
this.setSize(325, 370);
this.setLayout(null);
this.setResizable(false);
this.setDefaultCloseOperation(3);
jlDatos.setBounds(5, 0, 300,25);
this.getContentPane().add(jlDatos);
jtaDatos.setBounds(5, 30, 300,300);
jspDatos=new JScrollPane(jtaDatos);
jspDatos.setBounds(5, 30, 300, 300);
this.getContentPane().add(jspDatos);
jmbBarra.add(jmArchivo);
jmArchivo.add(jmiSalir);
jmbBarra.add(jmVer);
jmbBarra.add(jmAcciones);
jmAcciones.add(jmiComenzar);
jmAcciones.add(jmiDetener);
jmAcciones.add(jmiRealizar_otra_tarea);
this.jmiRealizar_otra_tarea.addActionListener(this);
this.jmiComenzar.addActionListener(this);
this.jmiDetener.addActionListener(this);
this.jmiSalir.addActionListener(this);
this.setJMenuBar(jmbBarra);
this.show();
}//Constructor
@Override
public void actionPerformed(ActionEvent evt)
{
click_salir(evt);
this.click_comenzar(evt);
this.click_detener(evt);
this.click_realizar_otra_tarea(evt);
}//public void actionPerformed(ActionEvent evt)
public void click_realizar_otra_tarea(ActionEvent evt)
{
if(evt.getActionCommand().equalsIgnoreCase(this.jmiRealizar_otra_tarea.getText())==true)
{
try
{
String msj=JOptionPane.showInputDialog(this, "Escriba cualquier informacion aqui.","Cualquier informacion");
JOptionPane.showMessageDialog(this, msj);
}catch(Exception ex){JOptionPane.showMessageDialog(null, "No escribió nada en el input.");
}//Catch
}
}//click_realizar_otra_tarea
public void click_detener(ActionEvent evt)
{
if(evt.getActionCommand().equalsIgnoreCase(jmiDetener.getText())==true)
{
this.detener();
}
}//click_detener
public void click_comenzar(ActionEvent evt)
{
if(evt.getActionCommand().equalsIgnoreCase(jmiComenzar.getText())==true)
{
this.comenzar();
}
}//click_comenzar
public void click_salir(ActionEvent evt)
{
if(evt.getActionCommand().equalsIgnoreCase(jmiSalir.getText())==true)
{
System.exit(0);
}
}//click_salir
HiloRunnable hilo=new HiloRunnable();
public void comenzar()
{
try
{
hilo.run();//Cuando se ejecuta por primera vez.
}
catch(Exception ex)
{
//hilo;//Ha sido detenido o suspendido y entonces se resume o se continua con el hilo.
}
}//comenzar
public void detener()
{
try
{
hilo.wait();//Mejor se suspende. Es mejor que stop o sea mejor que detenerlo.
}//try
catch(Exception ex)
{
JOptionPane.showMessageDialog(this, ex.getMessage());
}//catch
}//detener
public class HiloRunnable extends MiRunnable
{
private int contador=0;
@Override
public void ejecutando_hilos() {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
contador++;
jtaDatos.setText(jtaDatos.getText() + "Contando="+ contador + "\n");
}//hilos_de_ejecusion
}//Mi_hilo
}//HiloRunnable
En un futuro subiré uno usando join(), el cual sirve para ejecutar primero un proceso y luego otro.
Esto es como para simular una fila de clientes.