En el modelo de desarrollo síncrono tradicional, cuando llamamos a una función, los datos se pasan a través de los parámetros de la función y el resultado final del cálculo se devuelve a través del valor de retorno de la función. Sin embargo, en el modo de desarrollo asíncrono de subprocesos múltiples, la transmisión y devolución de datos son muy diferentes del modo de desarrollo síncrono. Dado que la ejecución y finalización de subprocesos son impredecibles, al transferir y devolver datos, los datos no se pueden devolver a través de parámetros de función ni declaraciones de devolución como funciones. Este artículo presenta varios métodos para pasar datos a subprocesos por los motivos anteriores. En el próximo artículo, presentaremos métodos para devolver datos de subprocesos.
Si quieres tomarlo primero, debes dárselo primero. Generalmente, cuando se usan subprocesos, se requieren algunos datos de inicialización y luego el subproceso usa estos datos para procesar y devolver los resultados. Lo primero que debe hacer en este proceso es pasar datos al hilo.
1. Pasar datos a través del método constructor <BR>Al crear un hilo, debe crear una instancia de la clase Thread o su subclase. Por lo tanto, no nos resulta difícil pensar en pasar datos al hilo a través del método constructor de la clase de hilo antes de llamar al método de inicio. Y guarde los datos entrantes utilizando variables de clase para que las use el subproceso (en realidad se usan en el método de ejecución). El siguiente código demuestra cómo pasar datos a través del constructor:
Copie el código de código de la siguiente manera:
paquete de mitos;
la clase pública MyThread1 extiende Thread
{
nombre de cadena privada;
público MyThread1 (nombre de cadena)
{
this.nombre = nombre;
}
ejecución pública vacía()
{
System.out.println("hola " + nombre);
}
principal vacío estático público (String [] argumentos)
{
Hilo hilo = new MyThread1("mundo");
hilo.start();
}
}
Dado que este método transfiere datos mientras se crea el objeto de subproceso, los datos ya están en su lugar antes de que se ejecute el subproceso, por lo que los datos no se pasarán después de que se ejecute el subproceso. Si desea pasar datos más complejos, puede utilizar estructuras de datos como colecciones y clases. Aunque es más seguro utilizar el método constructor para transferir datos, causará muchos inconvenientes si hay muchos datos para transferir. Dado que Java no tiene parámetros predeterminados, si desea lograr efectos similares a los parámetros predeterminados, debe utilizar la sobrecarga. Esto no solo hace que el constructor en sí sea demasiado complejo, sino que también aumenta considerablemente el número de constructores. Por lo tanto, para evitar esta situación, pase los datos a través de métodos de clase o variables de clase.
2. Pasar datos a través de variables y métodos <BR>Generalmente hay dos oportunidades para pasar datos a un objeto. La primera oportunidad es pasar los datos a través del método constructor al crear el objeto, y la otra oportunidad es definir una serie. de datos en la clase. Métodos públicos o variables (también llamados campos). Luego, después de crear el objeto, asigne valores uno por uno a través de instancias de objetos. El siguiente código es una modificación de la clase MyThread1, utilizando un método setName para establecer la variable de nombre:
Copie el código de código de la siguiente manera:
paquete de mitos;
la clase pública MyThread2 implementa Runnable
{
nombre de cadena privada;
setName público vacío (nombre de cadena)
{
this.nombre = nombre;
}
ejecución pública vacía()
{
System.out.println("hola " + nombre);
}
principal vacío estático público (String [] argumentos)
{
MiHilo2 miHilo = nuevo MiHilo2();
myThread.setName("mundo");
Hilo hilo = nuevo hilo (mi hilo);
hilo.start();
}
}
3. Pasar datos a través de funciones de devolución de llamada <BR>Los dos métodos para pasar datos a subprocesos discutidos anteriormente son los más utilizados. Pero ambos métodos pasan datos activamente a la clase de subproceso en el método principal. Para los subprocesos, estos datos se reciben pasivamente. Sin embargo, en algunas aplicaciones es necesario obtener datos dinámicamente mientras se ejecuta el hilo. Por ejemplo, se generan tres números aleatorios en el método de ejecución del siguiente código y luego la suma de estos tres números aleatorios se calcula mediante el método de proceso. de la clase Trabajo, y Devuelve el resultado a través del valor de la clase Datos. Como puede verse en este ejemplo, se deben obtener tres números aleatorios antes de devolver el valor. En otras palabras, este valor no se puede pasar a la clase de hilo por adelantado.
Copie el código de código de la siguiente manera:
paquete de mitos;
datos de clase
{
valor int público = 0;
}
trabajo de clase
{
proceso de anulación pública (datos de datos, números enteros)
{
para (int n: números)
{
valor.datos += n;
}
}
}
clase pública MyThread3 extiende Thread
{
trabajo privado;
público MyThread3 (trabajo trabajo)
{
this.work = trabajo;
}
ejecución pública vacía()
{
java.util.Random aleatorio = nuevo java.util.Random();
Datos datos = nuevos datos();
int n1 = aleatorio.nextInt(1000);
int n2 = aleatorio.nextInt(2000);
int n3 = aleatorio.nextInt(3000);
work.process(data, n1, n2, n3); // Usar función de devolución de llamada);
System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+"
+ String.valueOf(n3) + "=" + data.value);
}
principal vacío estático público (String [] argumentos)
{
Hilo hilo = new MyThread3(new Work());
hilo.start();
}
}
El método de proceso en el código anterior se llama función de devolución de llamada. En esencia, las funciones de devolución de llamada son funciones de eventos. En la API de Windows, las funciones de devolución de llamada se utilizan a menudo para interactuar con datos entre el programa que llama a la API. Por lo tanto, el proceso de llamar a la función de devolución de llamada es el proceso original de desencadenar el evento. En este ejemplo, llamar al método de proceso para obtener datos equivale a activar un evento en el método de ejecución.