¿Alguien puede sugerirme cómo puedo pasar un parámetro a un hilo?
Además, ¿cómo funciona para las clases anónimas?
java
multithreading
Steve
fuente
fuente
Consumer<T>
.Respuestas:
Debe pasar el parámetro en el constructor al objeto Runnable:
e invocarlo así:
fuente
r
tendrá el mismo argumento, por lo que si queremos pasar diferentes argumentos a múltiples subprocesos en ejecución,MyThread
tendremos que crear una nuevaMyThread
instancia usando el argumento deseado para cada subproceso. En otras palabras, para poner en marcha un hilo necesitamos crear dos objetos: Thread y MyThread. ¿Se considera esto malo en cuanto al rendimiento?Para clases anónimas:
En respuesta a las ediciones de preguntas aquí es cómo funciona para las clases anónimas
Clases con nombre:
Tiene una clase que extiende Thread (o implementa Runnable) y un constructor con los parámetros que desea pasar. Luego, cuando crea el nuevo hilo, debe pasar los argumentos y luego comenzar el hilo, algo como esto:
Runnable es una solución mucho mejor que Thread BTW. Entonces preferiría:
Esta respuesta es básicamente la misma que esta pregunta similar: cómo pasar parámetros a un objeto Thread
fuente
parameter
directamente desde elrun()
método sin usar un campo comop
en absoluto. Parece funcionar. ¿Hay alguna cosa sutil multihilo que me falta al no copiarparameter
dep
antemano?)
en el primer ejemplofinal X parameter
antes de lanew Runnable()
línea, podría acceder alparameter
interiorrun()
. No necesitaba necesitar hacer el extrap = parameter
.final
ya no es tan importante; es suficiente si la variable es efectivamente definitiva (a pesar de que no hace daño tenerlo)a través del constructor de una clase Runnable o Thread
fuente
@Override
para?@Override
dice explícitamente que está anulando el método abstracto en la clase Thread.Esta respuesta llega muy tarde, pero tal vez alguien la encuentre útil. Se trata de cómo pasar un parámetro (s) a un
Runnable
sin siquiera declarar la clase nombrada (útil para los inliners):Por supuesto, puede posponer la ejecución de
start
un momento más conveniente o apropiado. Y depende de usted cuál será la firma delinit
método (por lo que puede tomar más y / o argumentos diferentes) y, por supuesto, incluso su nombre, pero básicamente se hace una idea.De hecho, también hay otra forma de pasar un parámetro a una clase anónima, con el uso de los bloques inicializadores. Considera esto:
Entonces todo sucede dentro del bloque inicializador.
fuente
this.myParam
realmente necesario entonces? ¿No podría simplemente descartar las variables privadas y referirse a la variable desde el ámbito externo? Entiendo (por supuesto) que esto tiene algunas implicaciones, como que la variable esté abierta para cambiar después de comenzar el hilo.Cuando crea un hilo, necesita una instancia de
Runnable
. La forma más fácil de pasar un parámetro sería pasarlo como argumento al constructor:Si luego desea cambiar el parámetro mientras se está ejecutando el subproceso, simplemente puede agregar un método de establecimiento a su clase ejecutable:
Una vez que tenga esto, puede cambiar el valor del parámetro llamando así:
Por supuesto, si desea activar una acción cuando se cambia el parámetro, tendrá que usar bloqueos, lo que hace que las cosas sean considerablemente más complejas.
fuente
Para crear un hilo, normalmente crea su propia implementación de Runnable. Pase los parámetros al hilo en el constructor de esta clase.
fuente
Puede extender el o el y proporcionar los parámetros que desee. Hay ejemplos simples en los documentos . Los portaré aquí:
Thread
class
Runnable
class
fuente
Escriba una clase que implemente Runnable y pase lo que necesite en un constructor adecuadamente definido, o escriba una clase que extienda Thread con un constructor adecuadamente definido que llame a super () con los parámetros apropiados.
fuente
A partir de Java 8, puede usar una lambda para capturar parámetros que sean efectivamente finales . Por ejemplo:
fuente
En Java 8 puede usar
lambda
expresiones con la API de concurrencia yExecutorService
como un reemplazo de nivel superior para trabajar con hilos directamente:Ver también
executors
javadocs .fuente
Sé que llego unos años tarde, pero me encontré con este problema y adopté un enfoque poco ortodoxo. Quería hacerlo sin hacer una nueva clase, así que esto es lo que se me ocurrió:
fuente
Parámetro que pasa por los métodos start () y run ():
fuente
Puede derivar una clase de Runnable, y durante la construcción (digamos) pasar el parámetro.
Luego ejecútalo usando Thread.start (Runnable r);
Si quiere decir mientras el subproceso se está ejecutando, simplemente mantenga una referencia a su objeto derivado en el subproceso de llamada y llame a los métodos de establecimiento apropiados (sincronización cuando corresponda)
fuente
Hay una manera simple de pasar parámetros a ejecutables. Código:
fuente
No, no puede pasar parámetros al
run()
método. La firma te dice que (no tiene parámetros). Probablemente la forma más fácil de hacer esto sería usar un objeto especialmente diseñado que tome un parámetro en el constructor y lo almacene en una variable final:Una vez que haga eso, debe tener cuidado con la integridad de los datos del objeto que pasa a la 'WorkingTask'. Los datos ahora existirán en dos subprocesos diferentes, por lo que debe asegurarse de que sean seguros para subprocesos.
fuente
Una opción más; Este enfoque le permite utilizar el elemento Runnable como una llamada de función asincrónica. Si su tarea no necesita devolver un resultado, por ejemplo, solo realiza alguna acción, no necesita preocuparse por cómo reenvía un "resultado".
Este patrón le permite reutilizar un elemento, donde necesita algún tipo de estado interno. Cuando no se pasan parámetros en el constructor, se necesita cuidado para mediar el acceso de los programas a los parámetros. Es posible que necesite más verificaciones si su caso de uso involucra a diferentes personas que llaman, etc.
}
Hilo t = nuevo Hilo (nuevo MyRunnable (parámetro)); t.start ();
Si necesita un resultado del procesamiento, también deberá coordinar la finalización de MyRunnable cuando finalice la subtarea. Puede devolver una llamada o simplemente esperar en el hilo 't', etc.
fuente
Especial para Android
Para fines de devolución de llamada, generalmente implemento mi propio genérico
Runnable
con parámetros de entrada:El uso es simple:
En gerente:
fuente
Cree una variable local en su clase que
extends Thread
oimplements Runnable
.De esta manera, puede pasar una variable cuando la ejecuta.
La salida:
fuente