Bueno, ya había posteado esto en otro foro, es una introducción muy básica para que se hagan la idea de como manejar threads en java, para que el novato no se lie al leer esto por primera vez, si eres ya un experto, te puede parecer muy sencillo todo lo que digo aquí, recuerda que es una simple introducción en las limitadas palabras de este usuario que se apoda y hace llamar Plaga.SUBPROCESOSLa animación es un uso ideal para los subprocesos,la forma en la que Java maneja más de una tarea de programación al mismo tiempo.
Un subproceso es parte de un programa que se configura para ejecutar sus propias condiciones mientras el resto del programa hace otra cosa.
A esto también se le llama multitarea debido a que el programa maneja mas de una tarea simultaneament
e.
Los subprocesos son ideales para hacer cualquier cosa que tome mucho tiempo de procesamiento y está corriendo continuamente.
Por ejemplo la creación de dibujos repetidos para crear una animación.
Al poner la carga de un trabajo en un subproceso, usted deja libre al resto del programa para manejar otras cosas.
Suponga que tiene un programa gestor de descargas, usted pone su bonito programa para descargar algo y el programa solo se enfoca en descargar.
Usted no podra cerrar el programa para continuar otro día ya que no respondera hasta que termine su tarea actual, imagine que tiene un ancho de banda de 56Kbps.
Y el programa se demora unos 2 días para descargar, si quiere tener ese programa, no podra cerrar ese gestor, por 2 días e aquí donde entra el trabajo de los threads.
COMO ESCRIBIR PROGRAMAS CON SUBPROCESOSPara usar un subproceso en un programa, puede hacer 5 modificaciones a su archivo de clases:
Modificar la declaración de esa clase agregando el texto implements Runnable.
Crear un objeto Thread que contenga el subproceso.
Sobreponer el método start() para crear el subproceso e iniciar su ejecución.
Sobreponer el metodo stop() para asignar null al subproceso en ejecución.
Cree un método run() que contenga las instrucciones que hagan que el applet corra continuamente.
La palabra clave implements es semejante a la palabra clave extends debido a que modifica la clase que está delcarada en la misma línea.
El siguiente es un ejemplo de una clase que utiliza tanto extendes como implements:
public class animation extends javax.swing.JApplet
implements Runnable {
//...
}
Aunque la declaración de clase a sido dividida en 2 líneas, todo lo que se encuentre desde la palabra clave public hasta la llave izquierda "{" define la clase.
Runnable es un tipo especial de clase llamada interfaz.
Una interfaz es una forma para que una clase herede métodos que de otro modo no podrían se heredados de sus superclases.
Estos métodos pueden ser implementados por cualquier clase que necesesite el comportamiento
. En este ejemplo la interfaz Runnable es implementada por clases que trabajaran con subprocesos.
Runnable proporciona una definición para el método run(), el cual es llamado para iniciar un subproceso.
La clase Thread es parte del paquete estándar java.lang, por lo que no tiene que haber sido puesta disponible a traves de una instrucción import.
Iniciar la creación de un objeto Thread es tan sencillo como darle un nombre a un perro, como en la instrucción siguiente:
Thread runner;
Para nuestro ejemplo, crearemos el objeto en el método del applet start(). La variable runner tendrá el valor null hasta que el objeto sea creado realmente.
El lugar ideal para crearlo es el método start() del applet. El método siguiente verifica que haya sido creado el subproceso, si no es así lo crea:
public void start() {
if (runner == null) {
runner = new Thread(this);
runner.start();
}
}
La palabra clave this utilizada en el constructor Thread() es una forma de referirse al objeto en que se ejecuta el método, el applet en si mismo. Mediante this el applet se identifica como la clase que proporciona el comportamiento para ejecutar el subproceso.
Para ejecutar un subproceso, se llama a su método start(), como en esta instrucción del ejemplo anterior:
runner.start();
Cuando se llama al método start() del subprocesom, este llama al método run() de la clase que maneja el subproceso actualmente.
En este ejemplo, el applet implementa la interfaz Runnable y ha sido enlazado al objeto runner, a través de la palabra clave this. Se debe agregar un método run() al applet para que este funcione:
public void run() {
//Lo que hace el applet...
}
El método run() es el corazón de la aplicación con subprocesos.
Después de haber llenado el método run() con cualquier comportamiento que el subproceso necesite, el último paso para una aplicación con subprocesos es usar el método stop() para detener el subproceso.
La forma de detener un subproceso es establecer su objeto a null. Esto no detendrá al subproceso, pero usted diseña su método run() para que funcione y este en ejecución mientras su objeto Thread sea diferente a null.
La programación con subprocesos es mucho mas clara si se ve realmente en acción, aquí tengo un ejemplo de un applet animado que despliega la fecha y hora con actualizacione
s constantes.
Esto crea un reloj digital como el que muestro en la imagen:

Un ejemplo sencillo, pero que muestra realmente como funciona la programación con subporcesos y aquí el código completo:
import java.awt.Graphics;
import java.awt.Font;
import java.util.Date;
public class DigitalClock extends java.applet.Applet implements Runnable {
Font theFont = new Font("TimesRoman", Font.BOLD, 24);
Date theDate;
Thread runner;
public void start() {
if (runner == null) {
runner = new Thread(this);
runner.start();
}
}
public void stop() {
if (runner != null) {
runner = null;
}
}
public void run() {
Thread thisThread = Thread.currentThread();
while (runner == thisThread) {
repaint();
try {
Thread.sleep(1000);
}catch (InterruptedException e) { }
}
}
public void paint(Graphics screen) {
theDate = new Date();
screen.setFont(theFont);
screen.drawString(" " + theDate.toString(), 10, 50);
}
}
Cualquier duda o sugerencia para mejorar, sera bien recibida

eso fue todo por ahora, bytes
by Plaga