1. Defina una clase que herede la clase Thread, anule el método de ejecución en la clase, llame al método de inicio del objeto de clase, el método de inicio inicie el subproceso y llame al método de ejecución. La clase Thread se usa para describir subprocesos; esta clase define una función ejecutada, que se usa para almacenar el código que ejecutará el subproceso.
2. Defina una clase para implementar la interfaz Runnable, anule los métodos en la interfaz Runnable, cree un objeto de subproceso a través de la clase Thread, pase el objeto de subclase de la interfaz Runnable como un parámetro real al constructor de la clase Thread y llame se llamará al método de inicio de la clase Thread para iniciar el hilo. Se llamará al método de ejecución en la subclase de la interfaz Runnable;
La forma de implementar la interfaz Runnable evita las limitaciones provocadas por la herencia única;
Hilo T;
T.setMaemon(true);// Establece el hilo como hilo de fondo; el hilo de fondo finaliza automáticamente cuando finalizan todos los hilos de primer plano;
T.notify();//Despierta este hilo;
T.notifyAll();//Despierta todos los hilos;
T.interrupt();//Interrumpir hilo;
Thread.sleep(100);//Pausar el hilo durante 100 milisegundos
sincronizado: de forma predeterminada, se bloquea solo y los objetos personalizados también se pueden bloquear;
Debe haber dos o más subprocesos en ejecución. Varios subprocesos utilizan el mismo bloqueo. Se debe garantizar que solo se ejecute un subproceso durante el proceso de sincronización.
Determinar la sincronización: aclarar qué códigos requieren ejecución de subprocesos múltiples, aclarar datos compartidos y aclarar qué declaraciones en el código de ejecución de subprocesos múltiples operan en datos compartidos;
clase Tickets implementa Runnable
{
tick int privado = 100;
ejecución vacía pública () { // ejecución vacía pública sincronizada ()
mientras (marca > 0) {
sincronizado (esto) {
si (marca > 0) {
intentar {
Hilo.dormir(100);
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
System.out.println(this.toString() + "venta:" + tick--);
}
}
}
}
Como se indicó anteriormente: los ticks son datos compartidos para operar los ticks, es necesario operarlos de forma sincronizada. Lo que son los bloqueos sincronizados son los propios Tickets.
Mecanismo de activación en espera: cuando operan subprocesos de sincronización, deben identificar los bloqueos retenidos por los subprocesos que operan. Solo los subprocesos en espera en el mismo bloqueo pueden activarse notificando en el mismo bloqueo. No se pueden activar subprocesos diferentes. (es decir: esperar y despertar deben ser el mismo bloqueo)