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.