UNIDAD III.- Programación concurrente con Java A).- Dos instancias de un contador simple (el proceso es completamente secuencial). package hilosinicio; public class Contador{ private String mensaje; public Contador(String mensaje){ this.mensaje = mensaje; } public void contar(){ for(int i=0;i<=10;i++){ System.out.println(mensaje+" = "+i); } } } package hilosinicio; public class Main { public static void main(String[] args) { System.out.println("Inicio de main"); Contador x1 = new Contador("UNO"); Contador x2 = new Contador("DOS"); System.out.println("Inicio de UNO"); x1.contar(); System.out.println("Fin de UNO"); System.out.println("Inicio de DOS"); x2.contar(); System.out.println("Fin de DOS"); System.out.println("Fin de main"); } } B).- Dos instancias de un contador implementado como un hilo. package hilosinicio; public class Contador extends Thread{ private String mensaje; public Contador(String mensaje){ this.mensaje = mensaje; } public void run(){ try{ for(int i=0;i<=10;i++){ System.out.println(mensaje+" = "+i); } sleep(10); //milisegundos } } catch(InterruptedException e){ System.out.println("Error"); } } package hilosinicio; public class Main { public static void main(String[] args) { System.out.println("Inicio de main"); Contador x1 = new Contador("UNO"); Contador x2 = new Contador("DOS"); System.out.println("Inicio de UNO"); x1.start(); System.out.println("Fin de UNO"); System.out.println("Inicio de DOS"); x2.start(); System.out.println("Fin de DOS"); System.out.println("Fin de main"); } } C).- Ejemplo de hilos en ambiente gráfico package hilosgrafico; import javax.swing.*; import java.awt.*; public class Ventana extends JPanel{ private JSlider barra1; private JSlider barra2; private JSlider barra3; public Ventana(){ addComponentes(); } public JSlider getBarra1(){ return barra1; } public JSlider getBarra2(){ return barra2; } public JSlider getBarra3(){ return barra3; } public void addComponentes(){ JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); Label l1 = new Label("Contador 1"); Label l2 = new Label("Contador 2"); Label l3 = new Label("Contador 3"); setLayout(new BorderLayout()); barra1 = new JSlider(JSlider.VERTICAL, 0,1000, 0); barra1.setMajorTickSpacing(2); barra1.setMinorTickSpacing(1); barra1.setPaintTicks(true); barra2 = new JSlider(JSlider.VERTICAL, 0,1000, 0); barra2.setMajorTickSpacing(2); barra2.setMinorTickSpacing(1); barra2.setPaintTicks(true); barra3 = new JSlider(JSlider.VERTICAL, 0,1000, 0); barra3.setMajorTickSpacing(2); barra3.setMinorTickSpacing(1); barra3.setPaintTicks(true); l1.setAlignment(Label.CENTER); l2.setAlignment(Label.CENTER); l3.setAlignment(Label.CENTER); add(p1,"Center"); add(p2,"South"); p1.setLayout(new GridLayout(1,3)); p2.setLayout(new GridLayout(1,3)); p1.add(barra1); p1.add(barra2); p1.add(barra3); p2.add(l1); p2.add(l2); p2.add(l3); } } class Contador extends Thread{ private JSlider slider; public Contador(JSlider slider){ this.slider = slider; } public void run(){ try{ for(int i=0;i<=1000;i++){ slider.setValue(i); for(int j=0;j<10000000;j++); Thread.sleep(1); } } catch(InterruptedException e){ System.out.println("Error"); } } } package hilosgrafico; import javax.swing.*; public class MiFrame extends JFrame{ private private private private Ventana v1; Contador c1; Contador c2; Contador c3; public MiFrame(){ super("Ventana con Sliders"); setSize(400,400); setLocation(200,100); addComponentes(); setVisible(true); c1.setPriority(10); c2.setPriority(1); c1.start(); c2.start(); c3.start(); } public void v1 = new c1 = new c2 = new c3 = new add(v1); } addComponentes(){ Ventana(); Contador(v1.getBarra1()); Contador(v1.getBarra2()); Contador(v1.getBarra3()); } package hilosgrafico; public class Main { public static void main(String[] args) { new MiFrame(); } } D.- Implementando un hilo utilizando la interfaz Runnable package hilosinicio; public class OtroContador implements Runnable{ public void run(){ try{ for(int i=0;i<=10;i++){ System.out.println(Runnable+" = "+i); Thread.sleep(10); //milisegundos } } catch(InterruptedException e){ System.out.println("Error"); } } } package hilosinicio; public class Main { public static void main(String[] args) { System.out.println("Inicio de main"); Contador x1 = new Contador("UNO"); Contador x2 = new Contador("DOS"); OtroContador x3 = new OtroContador(); Thread x4 = new Thread(x3); System.out.println("Inicio de UNO"); x1.start(); System.out.println("Fin de UNO"); System.out.println("Inicio de DOS"); x2.start(); System.out.println("Fin de DOS"); System.out.println("Inicio de Runnable"); x4.start(); System.out.println("Fin de Runnable"); System.out.println("Fin de main"); } } E.- Implementando un objeto gráfico sin hilos import java.awt.*; import java.awt.event.*; public class HPelota extends Frame{ private Button inicio; private Balon balon; public HPelota(){ super("Ejemplo de Hilos"); setSize(400,400); setBackground(Color.yellow); addComponentes(); addEventos(); setVisible(true); } public void addComponentes(){ setLayout(new FlowLayout()); inicio = new Button("Iniciar"); add(inicio); } public void addEventos(){ addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); inicio.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ Graphics g = getGraphics(); Balon b = new Balon(g); b.pintar(); } }); } class Balon { private int x; private int y; private int diametro; private int xInc; private int yInc; private Graphics g; public Balon(Graphics g){ x=(int)(Math.random()*300+1); y=(int)(Math.random()*300+1); diametro=25; double signo1=Math.random(); double signo2=Math.random(); xInc = 5*(signo1>0.5?1:-1); yInc = signo2>0.5?5:-5; this.g = g; } public void pintar(){ for(int n=1;n<300;n++){ g.setColor(Color.YELLOW); g.fillOval(x,y,diametro,diametro); if(x + xInc <= 0) xInc = -xInc; if(x + xInc >= 400) xInc = -xInc; if(y + yInc <= 0) yInc = -yInc; if(y + yInc >= 400) yInc = -yInc; x+=xInc; y+=yInc; g.setColor(Color.RED); g.fillOval(x,y,diametro,diametro); try{ Thread.sleep(10); } catch(InterruptedException e){ } } g.setColor(Color.YELLOW); g.fillOval(x,y,diametro,diametro); } } } F.- Implementando un objeto gráfico con hilos import java.awt.*; import java.awt.event.*; public class HPelota extends Frame{ private Button inicio; private Balon balon; public HPelota(){ super("Ejemplo de Hilos"); setSize(400,400); setBackground(Color.yellow); addComponentes(); addEventos(); setVisible(true); } public void addComponentes(){ setLayout(new FlowLayout()); inicio = new Button("Iniciar"); add(inicio); } public void addEventos(){ addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); inicio.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ Graphics g = getGraphics(); Balon b = new Balon(g); b.run(); } }); } class Balon extends Thread{ private int x; private int y; private int diametro; private int xInc; private int yInc; private Graphics g; public Balon(Graphics g){ x=(int)(Math.random()*300+1); y=(int)(Math.random()*300+1); diametro=25; double signo1=Math.random(); double signo2=Math.random(); xInc = 5*(signo1>0.5?1:-1); yInc = signo2>0.5?5:-5; this.g = g; } public void run(){ for(int n=1;n<300;n++){ g.setColor(Color.YELLOW); g.fillOval(x,y,diametro,diametro); if(x + xInc <= 0) xInc = -xInc; if(x + xInc >= 400) xInc = -xInc; if(y + yInc <= 0) yInc = -yInc; if(y + yInc >= 400) yInc = -yInc; x+=xInc; y+=yInc; g.setColor(Color.RED); g.fillOval(x,y,diametro,diametro); try{ Thread.sleep(10); } catch(InterruptedException e){ } } g.setColor(Color.YELLOW); g.fillOval(x,y,diametro,diametro); } } }