Hay varias formas de crear múltiples hilos.
(1). Primero, defina una clase para heredar la clase principal Thread y anule el método run() en la clase principal. Agregue código de tarea específico o lógica de procesamiento al método run().
(2) Cree directamente un objeto de la clase ThreadTest o utilice polimorfismo para declarar la variable como el tipo de la clase principal.
(3) Llame al método de inicio, el hilo se inicia y el método run() se llama implícitamente.
[java]? ¿Mirando la llanura? Copiar
¿Público? ¿clase? ¿Prueba de hilo? ¿extender? Hilo {
¿Público? ¿Vacío? run(){
for(int?I = 0;ilt=10;i){
sistema fuera . ?
}
¿Público? ¿Electricidad estática? ¿Vacío? principal(Cadena[]?args)? {
¿Prueba de hilo? hilo1=nuevo? ThreadTest();
¿ThreadTest? hilo2=nuevo? ThreadTest();
hilo 1. start();
hilo 2. start();
}
} p>
2. Cree un hilo implementando la interfaz Runnable.
(1). Defina una clase para implementar la interfaz Runnable y anule el método run() en la interfaz. Agregue código de tarea específico o lógica de procesamiento al método run().
(2) Cree un objeto de la clase de implementación de la interfaz Runnable.
(3) Para crear un objeto de la clase ThreadTest, necesita encapsular el objeto de la clase implementada por la interfaz Runnable. (La interfaz puede implementar herencia múltiple)
(4) Llame al método start() del objeto Thread para iniciar el hilo.
[java]? ¿Mirando la llanura? Copiar
¿Público? ¿clase? ¿Prueba de hilo? ¿Utensilios? Ejecutable{
@override
¿Público? ¿Vacío? correr()? {
for(int?I = 0;ilt=10;i){
sistema fuera . println(I);
}? p>
}
¿Público? ¿Electricidad estática? ¿Vacío? principal(Cadena[]?args)? {
¿Prueba de hilo? threadTest=nuevo? ThreadTest();
¿Hilo? theard=nuevo? thread(threadTest);
theard . start();
}
}
3. Crear hilos a través de Callable y Future<. /p>
(1) Cree una clase de implementación de la interfaz invocable e implemente el método call(). Este método servirá como ejecutor de subprocesos y tendrá un valor de retorno.
(2) Cree una instancia de la clase de implementación Callable, use la clase FutureTask para encapsular el objeto Callable y encapsule el valor de retorno del método call() del objeto Callable.
(3) Utilice el objeto FutureTask como destino del objeto Thread para crear e iniciar un nuevo hilo.
(4) Llame al método get() del objeto FutureTask para obtener el valor de retorno después de ejecutar el subproceso.
[java]? ¿Mirando la llanura? Copiar
¿Público? ¿clase? ¿Prueba de hilo? ¿Utensilios? invocable lt entero gt{
@override
¿Público? ¿Entero? llamar()? ¿Tiro que cae? ¿excepción? {
int? ¿Contar? =0;
for(int?I = 0;ilt=10;i){
cuenta = cuenta I;
}
¿Regresar? Contar;?
}
¿Público? ¿Electricidad estática? ¿Vacío? principal(Cadena[]?args)? ¿Tiro que cae? ¿Excepción de interrupción? ¿Excepción de ejecución? {
¿Prueba de hilo? prueba=nueva? ThreadTest();
FutureTask ltinteteger gt? ¿Hilo? =?¿Nuevo? FutureTask lt gt(prueba);
¿Nuevo? Hilo ("hilo con valor de retorno"). start();
system . println(thread . get());
}
}
Implementando Runnable. Los subprocesos creados por la interfaz pueden * * compartir el mismo objeto de destino (tread demo 1tt = newtread demo 1());), de modo que varios subprocesos idénticos puedan manejar el mismo recurso.
Mira otra explicación de JDK:
¿Esa? ¿Ejecutable? La interfaz debe ser implementada por cualquier clase cuyas instancias sean ejecutadas por un hilo. La clase debe definir un método sin parámetros llamado drun.
Esta interfaz está destinada a proporcionar un protocolo común para objetos que desean ejecutar código mientras están activos. ¿Te gusta ejecutable? Se implementa mediante classThread. Activo simplemente significa que se ha iniciado un hilo y no se ha detenido.
Además,? ¿Ejecutable? Proporciona métodos para activar una clase sin subclasificar Thread. Una clase que implementa Runnable. ¿Se puede ejecutar sin subclasificar Thread? ¿Creando una instancia de un hilo? instancia y pasar a sí mismo como el objetivo. ¿En la mayoría de los casos esto no es factible? Esto debe usarse si solo planea anular therun(). método sin otros hilos? método. Esto es importante porque las clases no deben subclasificarse a menos que el programador tenga la intención de modificar o mejorar el comportamiento básico de la clase.
Al crear múltiples subprocesos implementando las interfaces Runnable y Callable, las ventajas son las siguientes:
La clase de subproceso solo implementa la interfaz Runnable o la interfaz Callable y puede heredar otras clases.
De esta manera, varios subprocesos pueden compartir el mismo objeto de destino, lo cual es muy adecuado para que varios subprocesos procesen el mismo recurso, de modo que la CPU, el código y los datos se puedan separar para formar una unidad clara. modelo, que refleja mejor la idea orientada a objetos.
Las desventajas son:
La programación es un poco complicada. Si desea acceder al hilo actual, debe utilizar el método Thread.currentThread().
Adopte el método de heredar la clase de hilo:
Ventajas de (1): Es simple de escribir. Si necesita acceder al hilo actual, puede obtener el hilo actual sin utilizar el método Thread.currentThread().
(2) Desventajas: debido a que la clase thread hereda la clase Thread, no puede heredar otras clases principales.
Adopte el método para implementar la interfaz ejecutable:
(1) Ventajas: la clase de subproceso solo implementa la interfaz Runable y también puede heredar otras clases. De esta manera, varios subprocesos pueden compartir el mismo objeto de destino, lo cual es muy adecuado para que varios subprocesos procesen el mismo recurso, separando el código y los datos de la CPU, formando un modelo claro y encarnando mejor las ideas orientadas a objetos.
(2) Desventajas: La programación es un poco complicada.
Si necesita acceder al hilo actual, debe utilizar el método Thread.currentThread().