package mx.edu.ulsa.cib4132005.threads;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import mx.edu.ulsa.cib4132005.graficos.VentanaInicial;

public class SecuenciaEjecucion extends VentanaInicial {
	private boolean continua2=false, continua3=false;
	private class Flujo1 implements Runnable {
		private Flujo2 siguiente;
		Flujo1(Flujo2 siguiente) {
			this.siguiente= siguiente;
		}
		public synchronized void run(){
			imprimir("Flujo1"); imprimirnl();
			continua2=true;
			this.siguiente.desbloquear();
		}
	}
	private class Flujo2 implements Runnable {
		private Flujo3 siguiente;
		Flujo2(Flujo3 siguiente){
			this.siguiente=siguiente;
		}
		public synchronized void run(){
		 try {	
			while (!continua2){
				this.wait();
			}
		 } catch (InterruptedException ex){
		 	imprimir(ex.getMessage());imprimirnl();
		 }
		 imprimir("Flujo2"); imprimirnl();
		 continua3=true;
		 this.siguiente.desbloquear();	
		}
		synchronized void desbloquear(){
			this.notify();
		}
	}
	private class Flujo3 implements Runnable {
		public synchronized void run(){
			try {	
				while (!continua3){
					this.wait();
				}
			 } catch (InterruptedException ex){
			 	imprimir(ex.getMessage());imprimirnl();
			 }
			imprimir("Flujo3"); imprimirnl();
		}
		synchronized void desbloquear(){
			this.notify();
		}
	}
	private class Handler implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			continua2=false;continua3=false;
			Flujo3 f3=new Flujo3();
			Flujo2 f2=new Flujo2(f3);
			Flujo1 f1=new Flujo1(f2);
			Thread th1 = new Thread(f1);
			Thread th2 = new Thread(f2);
			Thread th3 = new Thread(f3);
			th1.start();th2.start();th3.start();
		}
	}
	private JButton bEjecutar;
	public void dibujar() {
		Container ct = super.getContainer();
		ct.add(bEjecutar = new JButton("Ejecutar"));
		bEjecutar.addActionListener(new Handler());
	}
	public static void main(String[] args) {
		new SecuenciaEjecucion();
	}
}
