Threads y Multithreading


Cuando un programa ejecuta, empieza a ejecutar, inicializa y llama métodos hasta terminar, está siguiendo un solo thread , es decir un solo lugar de contol para el programa. Multithreading permite que varios threads de ejecución corran simultáneamente dentro del mismo programa sin interferir entre sí

Cada thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos ligeros o contextos de ejecución. Típicamente, cada thread controla un único aspecto dentro de un programa, como puede ser supervisar la entrada en un determinado periférico o controlar toda la entrada/salida del disco.

Todos los threads comparten los mismos recursos, al contrario que los procesos en donde cada uno tiene su propia copia de código y datos (separados unos de otros). Gráficamente, los threads se parecen en su funcionamiento a lo que muestra la figura siguiente:
 


Si queremos hacer que un applet funcione con threads pueden seguirse los siguientes pasos:
 

  1. Cambiar la firma de la clase

  2.  
      public class MyAppletClass extends java.applet.Applet{
      }
      debe transformarse en:
       
      public class MyAppletClass extends java.applet.Applet implements Runnable{
      }
      Esto incluye el comportamiento que el applet requiere para correr un thread , en particular el método run() .


  3. Agregar una instancia de variable para el thread .
    1. Thread Runner;
      
  4. Agregar o modificar el método start() para que solo cree un nuevo thread y lo ejecute:

  5.  
      public void start() {
         if (Runner == null) {
             Runner = new Thread(this);
             Runner.start();
          }
      }
      Si cambiamos start() para que no haga nada, ¿Dónde pongo el cuerpo de mi applet? en un nuevo método run () que se ve como sigue:
       
      public void run() {
         // lo que hacia el applet
      }
      Además hay que agregar un método stop () para suspender la ejecución del thread.
       
      public void stop() {
         if (runner != null) {
             runner.stop();
             runner = null;
            }
      }
Para manejar valores que no pueden ser modificados de manera simultánea por dos threads , se usa la palabra synchronized , que le dice a Java que cierto bloque de código solo puede ser accesado por un thread a la vez. Las variables que deban ser accesibles se etiquetan como volatile para evitar sean guardadas en registros.
 
 

Ejemplos
 

ThreadLister.java
ThreadLister.html

Programacíon de Redes en Java


TCP/IP (Transmission Control Protocol/Internet Protocol) es el conjunto de protocolos de redes que usan los hosts de Internet para comunicarse entre sí.
 

Algunos términos:
 

Los Protocolos de Internet
 

TCP/IP es un conjunto de protocolos de comunicaciones. El nombre proviene de dos de ellos: TCP (Transmission Control Protocol) e IP (Internet Protocol). Sin embargo tambien incluye UDP (User Datagram Protocol), ICMP (Internet Control Message Protocol) y IGMP (Internet Group Multicast Protocol) entre otros.

Estos protocolos definen formatos estándar para intercambiar información entre hosts sin importar la conexión física entre ellas.
 
 

Arquitectura de Redes TCP/IP
 

Hay cuatro capas en el modelo de redes TCP/IP (contrastar con OSI). Cada protocolo en la suite de TCP/IP provee comunicación entre entidades en cada nivel. Las capas superiores utilizan a las inferiores para transmitir datos de host A host. Las capas son:
 

    1. Nivel Físico (Ethernet, Token Ring, PPP)

    2. Nivel Red (IP)

    3. Nivel Transporte (TCP, UDP)

    4. Nivel Aplicación (Telnet, HTTP, FTP, Gopher)
Cada nivel le va agregando un header a los datos al mandar un mensaje, y lo quita al recibirlo, para determinar que hacer con el dato.
 
 

El paquete  java.net
 

Es el paquete en Java que incluye los servicios de red. Hay tres tipos de clases incluídas:
 

    1. Clases de interface de Web

    2. Clases de interface a red (sockets)

    3. Clases de extensión
     
¿Qué clase debo usar?
  Seguridad
 

Uno de los propósitos de Java es permitir recibir y ejecutar programas desde cualquier lugar en la red. Para permitir esto, el runtime de Java limita qué pueden hacer las clases que se obtienen de la red.

Por ejemplo, Netscape Navigator 2.0 le dá más privilegios al código cargado del disco local que al que viene de la red. Una clase cargada de un daemon HTTP solo puede crear conexiones hacia el host desde el cual fue traído, mientras que si viene del host local puede conectarse a cualquier host. En cambio, el appletviewer de Sun puede configurarse para comportarse como el Navigator o no tener ninguna restricción a la conectividad en red. Las aplicaciones no tienen estas restricciones que tienen los applets.

La versión 1.1 del Java permite configurar las características de seguridad en los browsers (Netscape  Navigator 4.07 o superior, Internet Explorer 4.0 o superior), para esto, se han definido dos tipos de applets: Firmadas y No-Firmadas (signed , unsigned)

Para establecer una "firma" digital en un applet se requiere el uso del programa jar del JDK 1.1

Ejemplos


Práctica  4:
 

1