threads thread example entre diferencia java android multithreading runnable

java - thread - ¿Nuevo Runnable() pero no hay nuevo hilo?



runnable java (8)

Estoy tratando de entender el código here , específicamente la clase anónima

private Runnable mUpdateTimeTask = new Runnable() { public void run() { final long start = mStartTime; long millis = SystemClock.uptimeMillis() - start; int seconds = (int) (millis / 1000); int minutes = seconds / 60; seconds = seconds % 60; if (seconds < 10) { mTimeLabel.setText("" + minutes + ":0" + seconds); } else { mTimeLabel.setText("" + minutes + ":" + seconds); } mHandler.postAtTime(this, start + (((minutes * 60) + seconds + 1) * 1000)); } };

El articulo dice

El controlador ejecuta el código de actualización como parte de su hilo principal, evitando la sobrecarga de un segundo hilo.

¿No debería crear una nueva clase Runnable hacer un nuevo segundo hilo? ¿Cuál es el propósito de la clase Runnable aquí además de poder pasar una clase Runnable a postAtTime?

Gracias


¿No debería crear una nueva clase Runnable hacer un nuevo segundo hilo?

No. new Runnable no crea un segundo Thread .

¿Cuál es el propósito de la clase Runnable aquí además de poder pasar una clase Runnable a postAtTime?

Runnable está publicado en Handler . Esta tarea se ejecuta en el hilo, que está asociado con Handler .

Si el Handler está asociado con el subproceso de la interfaz de usuario, Runnable ejecuta en el subproceso de la interfaz de usuario.

Si el Handler está asociado con otro HandlerThread , Runnable se ejecuta en HandlerThread

Para asociar explícitamente a Handler con su MainThread (Hilo de UI), escriba el código a continuación.

Handler mHandler = new Handler(Looper.getMainLooper();

Si escribe es el siguiente, utiliza HandlerThread Looper.

HandlerThread handlerThread = new HandlerThread("HandlerThread"); handlerThread.start(); Handler requestHandler = new Handler(handlerThread.getLooper());


La mejor y más sencilla forma es pasar el argumento y crear un método de instancia y llamada

Llame al hilo usando crear un objeto de hilo y envíe un objeto de clase ejecutable con un parámetro o sin parámetro y comience el método del objeto de hilo.

En mi condición, estoy enviando el parámetro y lo usaré en el método de ejecución.

nuevo hilo (nuevo FCMThreadController ("2", nulo, "3", "1")). start ();

O

nuevo Thread (nuevo FCMThreadController ()). start ();

public class FCMThreadController implements Runnable { private String type; private List<UserDeviceModel> devices; private String message; private String id; public FCMThreadController(String type, List<UserDeviceModel> devices, String message, String id) { this.type = type; this.devices = devices; this.message = message; this.id = id; } public FCMThreadController( ) { } @Override public void run() { // TODO Auto-generated method stub } }


La interfaz Runnable es otra forma en la que puede implementar subprocesos múltiples además de extender la clase Thread debido a que Java le permite extender solo una clase.

Sin embargo, puedes usar el nuevo constructor Thread (Runnable Runnable) , algo como esto:

private Thread thread = new Thread(new Runnable() { public void run() { final long start = mStartTime; long millis = SystemClock.uptimeMillis() - start; int seconds = (int) (millis / 1000); int minutes = seconds / 60; seconds = seconds % 60; if (seconds < 10) { mTimeLabel.setText("" + minutes + ":0" + seconds); } else { mTimeLabel.setText("" + minutes + ":" + seconds); } mHandler.postAtTime(this, start + (((minutes * 60) + seconds + 1) * 1000)); } }); thread.start();


Puedes crear un hilo como este:

Thread thread = new Thread(new Runnable() { public void run() { } }); thread.start();

Además, puede usar Runnable, Asyntask, Timer, TimerTaks y AlarmManager para ejecutar los subprocesos.


Runnable es solo una interfaz, que proporciona el método ejecutado. Los subprocesos son implementaciones y utilizan Runnable para llamar al método run ().


Si quieres crear un nuevo Thread ... puedes hacer algo como esto ...

Thread t = new Thread(new Runnable() { public void run() { // your code goes here... }});


Un hilo es algo así como una rama. Multi-ramificado significa cuando hay al menos dos ramas. Si las ramas se reducen, entonces el mínimo sigue siendo uno. Éste es aunque como las ramas removidas, pero en general no lo consideramos rama.

De manera similar, cuando hay al menos dos subprocesos, lo llamamos programa de subprocesos múltiples. Si se reducen los hilos, el mínimo sigue siendo uno. Hello program es un programa de un solo subproceso, pero nadie necesita conocer los subprocesos múltiples para escribirlo o ejecutarlo.

En palabras sencillas, cuando no se dice que un programa tenga subprocesos, significa que no es un programa de múltiples subprocesos, sino que, en verdad, es un programa de un solo subproceso, en el que USTED PUEDE poner su código como si fuera multihilo

A continuación se proporciona un código inútil, pero será suficiente para eliminar algunas confusiones acerca de Runnable . Se imprimirá "Hola Mundo".

class NamedRunnable implements Runnable { public void run() { // The run method prints a message to standard output. System.out.println("Hello World"); } public static void main(String[]arg){ NamedRunnable namedRunnable = new NamedRunnable( ); namedRunnable.run(); } }


Runnable se usa a menudo para proporcionar el código que debe ejecutar un subproceso, pero Runnable sí no tiene nada que ver con los subprocesos. Es solo un objeto con un método run() .

En Android, la clase Handler se puede usar para pedirle al framework que ejecute algún código más adelante en el mismo hilo, en lugar de hacerlo en otro diferente. Runnable se utiliza para proporcionar el código que debe ejecutarse más adelante.