Practica 10
Practica10.
Buenas!! En esta y en la siguiente práctica os vamos a hablar un poco sobre threads, básicamente lo que nosotros sabemos y lo que como en las demás prácticas creemos que es más importante.
Vamos a empezar por comentar las diferencias entre las clases TwoThreads, TwoThreadsSimple y TwoThreadsSimple2.
En la clase TwoThreads, primeramente se crea un método (PrintThreadName()) que devuelve el nombre del proceso actual por pantalla, luego dentro del ‘main’ se crea un objeto de la interfaz Runnable en el que incluimos el método run() (indispensable al implementar esta interfaz), que lo que hace simplemente es invocar PrintThreadName().
Por último se crea un objeto de la clase Thread al que le pasamos como parámetro el objeto de la interfaz Runnable para que nos saque por pantalla el Thread que se esta ejecutando en ese momento. La ultima línea de código sirve para que imprima por pantalla donde se esta ejecutando el proceso actual, en nuestro caso en el ‘main’.
La clase TwoThreadsSimple implementa Runnable, por lo que esta obligada a crear el método run(), que como en el caso anterior invoca a PrintThreadName(). En el main de la clase crea un objeto de la misma clase y se lo pasa posteriormente a un objeto de Thread, como el objeto TwoThreadsSimple contiene los métodos run() y PrintThreadName() e implementa Runnable no hace falta llamar a los métodos de la clase.
**Como ejemplo también se hace lo mismo al crear un ActionListener y añadirle el escuchador, que para que funcione no hace falta llamar expresamente al método actionPerformed().
La última clase es la más sencilla de todas ya que extiende de Thread y esto hace todo más fácil. Simplemente crea los dos métodos de las anteriores clases y luego en el main crea un objeto de TwoThreadsSimple2, que como hereda de Thread solo con arrancarlo ya llama a los métodos de su clase tts2.start().
De las clases RaceCondition y RaceConditionSolved no vamos a comentar nada porque creemos que esta bien explicado n el guión y realmente tampoco lo entendíamos demasiado bien como para poder contaros algo sin liaros…
Para acabar os vamos a pasar a comentar como hemos hecho la clase StroboscopicGUI para que funcione como el ejecutable, realmente lo hemos hecho a ‘nuestra’ manera porque todavía no sabemos muy bien como utilizar procesos. Os dejamos comentado nuestro código para que le echéis un vistazo aunque como ya os decimos según dice la práctica no se debería hacer así pero es como nosotros sabemos y funciona!!!
public StroboscopicGUI(){
frame=new JFrame( “StroboscopicGUI” );
etiqueta1=new JLabel( “StroboscopicGUI” ,JLabel.CENTER);
panel=new JPanel();
frame.add(panel);
panel.setLayout(new BorderLayout());
panel.add(etiqueta1,BorderLayout.CENTER);
frame.setSize(200,200);
//setPack();
frame.setResizable(false);
frame.setVisible(true);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
try{
while(true){
etiqueta1.setOpaque(true);
etiqueta1.setForeground(Color.BLACK);
etiqueta1.setBackground(Color.WHITE);
Thread.sleep(100);
etiqueta1.setOpaque(true);
etiqueta1.setForeground(Color.WHITE);
etiqueta1.setBackground(Color.BLACK);
Thread.sleep(100);
}}
catch (InterruptedException e) {
System.out.println( “Interrupted while sleeping” );}
}
Lo del contador binario y demás os dejamos para que lo intentéis en casa, porque no os vamos a dar todo hecho…jeje. No en verdad no hemos tenido tiempo para “meterle mano” así que como referencia os recomendamos que os paséis por el blog de Jose y Marco’s que tienen algo explicado y os puede quedar un poco más claro.
Bueno y para acabar definitivamente en estas tres últimas prácticas os vamos a dejar con nuestro gran amigo Chuck Norris y sus actos celebres, ahí van las dos primeras:
Chuck Norris toma la sopa con tenedor.
Chuck Norris jugó a la ruleta rusa con un revolver completamente cargado y ganó.