1. Devolver datos a través de variables y métodos de clase.
El uso de este método para devolver datos requiere llamar al método de inicio antes de que los datos puedan obtenerse a través de variables o métodos de clase. Veamos primero qué resultados obtenemos del ejemplo 2-13.
Copie el código de código de la siguiente manera:
paquete de mitos;
clase pública MyThread extiende Thread
{
valor de cadena privada1;
valor de cadena privada2;
ejecución pública vacía()
{
value1 = "Devolver datos a través de variables miembro";
value2 = "Devolver datos a través del método miembro";
}
public static void main (String[] args) lanza una excepción
{
Hilo MiHilo = nuevo MiHilo();
hilo.start();
System.out.println("valor1:" + hilo.valor1);
System.out.println("valor2:" + hilo.valor2);
}
}
La ejecución del código anterior puede generar los siguientes resultados:
Copie el código de código de la siguiente manera:
valor1:nulo
valor2:nulo
Los resultados de ejecución anteriores parecen muy anormales. Se han asignado valores a valor1 y valor2 en el método de ejecución, pero se devuelve nulo. La razón por la que esto sucede es que los valores de valor1 y valor2 se generan inmediatamente después de llamar al método de inicio, y el método de ejecución aquí aún no ha ejecutado las declaraciones que asignan valores a valor1 y valor2. Para evitar esta situación, debe esperar hasta que se ejecute el método de ejecución antes de ejecutar el código que genera valor1 y valor2. Por lo tanto, podemos pensar en usar el método de suspensión para retrasar el hilo principal. Por ejemplo, podemos agregar la siguiente declaración después de thread.start():
dormir(1000);
Hacer esto puede retrasar el hilo principal durante 1 segundo antes de continuar, pero hay un problema con esto, es decir, ¿cómo sabemos cuánto tiempo retrasar? En este ejemplo, solo hay dos declaraciones de asignación en el método de ejecución y solo se crea un hilo. Por lo tanto, un retraso de 1 segundo es suficiente, pero si las declaraciones en el método de ejecución son complejas, este tiempo es difícil de predecir. Por tanto, este método no es estable.
Nuestro propósito es obtener los valores de valor1 y valor2, por lo que solo necesitamos determinar si valor1 y valor2 son nulos. Si ninguno de ellos es nulo, se pueden generar estos dos valores. Podemos utilizar el siguiente código para lograr este propósito:
Copie el código de código de la siguiente manera:
mientras (hilo.valor1 == nulo || hilo.valor2 == nulo);
El uso de la declaración anterior puede evitar esta situación de manera muy estable, pero este método consume demasiados recursos del sistema. Puede imaginar que si el código en el método de ejecución es muy complejo, el valor1 y el valor2 tardarán mucho en asignarse, por lo que el bucle while debe continuar ejecutándose hasta que tanto el valor1 como el valor2 no estén vacíos. Por lo tanto, podemos realizar las siguientes mejoras a la declaración anterior:
Copie el código de código de la siguiente manera:
mientras (hilo.valor1 == nulo || hilo.valor2 == nulo)
dormir(100);
En el ciclo while, después de juzgar los valores de valor1 y valor2 por primera vez, duerme durante 100 milisegundos y luego juzga estos dos valores. Esto ocupará menos recursos del sistema.
Aunque el método anterior se puede resolver muy bien, el modelo de subprocesos de Java nos proporciona una mejor solución, que es el método de unión. Como se mencionó anteriormente, la función de unirse es utilizar subprocesos para cambiar de ejecución asincrónica a ejecución sincrónica. Cuando el hilo se ejecuta sincrónicamente, no es diferente de obtener los datos de retorno de un método normal. Por lo tanto, este problema se puede resolver de manera más eficiente usando código como el siguiente:
Copie el código de código de la siguiente manera:
hilo.start();
hilo.join();
Después de ejecutar thread.join (), el método de ejecución del subproceso ha salido, lo que significa que el subproceso ha finalizado. Por lo tanto, puede utilizar de forma segura cualquier recurso de la clase MyThread después de thread.join() para obtener los datos devueltos.
2. Devolver datos mediante la función de devolución de llamada
De hecho, este método se introdujo en "Tres métodos para pasar datos a subprocesos". En el ejemplo del artículo "Tres métodos para pasar datos a subprocesos", los resultados del cálculo se pasan al subproceso a través del método de proceso de la clase Trabajo, pero al mismo tiempo, también se obtienen tres números aleatorios del subproceso a través del método de proceso. Por lo tanto, este método puede pasar datos y obtener datos del hilo.