2012-01-27 14 views
15

estoy tratando de entender el código here, en concreto la clase anónimanuevo Runnable() pero no hay un nuevo hilo?

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 artículo 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 subproceso? ¿Cuál es el propósito de la clase Runnable aquí además de poder pasar una clase Runnable a postAtTime?

Gracias

+2

No. Runnables no son 'Thread's. http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html –

Respuesta

41

Runnable se utiliza a menudo para proporcionar el código que se debe ejecutar un hilo, pero Runnable en sí no tiene nada que ver con las discusiones. Es solo un objeto con un método run().

En Android, la clase Handler se puede utilizar para pedir el marco para ejecutar algún código más tarde en el hilo misma, en lugar de en uno diferente. Runnable se utiliza para proporcionar el código que debe ejecutarse más tarde.

+0

"Runnable en sí no tiene nada que ver con los hilos" ¡esto es conceptualmente INCORRECTO! Por favor, lea la documentación. La interfaz Runnable debe ser implementada por cualquier clase cuyas instancias estén destinadas a ser ejecutadas por un hilo. También es confuso cuando se pasa Runnable, pero sucede algo en el mismo hilo. Por favor, lea sobre "principio de menor sorpresa". – glaz666

+13

@ glaz666, la documentación 'Runnable' habla de subprocesos porque son el uso * más común de' Runnable', pero la interfaz es adecuada para cualquier tipo de devolución de llamada. Creo que el uso que hace Android 'Handler' de' Runnable' es completamente razonable: es mejor que definir una nueva interfaz específica de Android que sea idéntica a 'Runnable' pero con un nombre diferente. – Wyzard

+0

Un ejemplo de "nuevo Runnable()" sin "extends Thread" ni "implementa Runnable": http://docs.oracle.com/javase/tutorial/uiswing/examples/start/HelloWorldSwingProject/src/start/HelloWorldSwing. java –

6

Runnable es solo una interfaz que proporciona el método de ejecución. Los subprocesos son implementaciones y usan Runnable para llamar al método run().

21

Si desea crear un nuevo Thread ... se puede hacer algo como esto ...

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

No es lo que pidió el OP. – alfoks

16

La interfaz Runnable es otra forma en que se puede implementar subprocesos múltiples aparte de la ampliación de la Thread clase debido al hecho de que Java le permite extender solo una clase.

Puede sin embargo, utilizar el constructor new 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(); 
+0

, este ejemplo crea un nuevo hilo o no, porque ha utilizado el hilo pero no se llama start() .. – sgarg

+1

@shishirgarg: Este ejemplo crea un nuevo objeto Thread. Para ejecutarlo, simplemente llame al método 'start()' así: 'thread.start()'. Esto debería llamar internamente al método 'run()' (nota, nunca deberías llamar al método 'run()') que inicia el hilo. – npinti

10

Puede crear un hilo como este:

Thread thread = new Thread(new Runnable() { 
        public void run() { 

         } 
        }); 
       thread.start(); 

Además, se puede utilizar Ejecutable, Asyntask, Temporizador , TimerTaks y AlarmManager para superar los hilos.

+0

puede anular el método run() de Thread. ¿Cuál es el beneficio de crear Runnable también? –

0

mejor y más fácil forma en que se acaba de pasar argumentos y crear instancia y llamar hilo de rosca método

llamada el uso de crear un objeto hilo y enviar un objeto de clase ejecutable con el parámetro o sin parámetro e inicio método de objeto de hilo.

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

nuevo Tema (nuevo FCMThreadController ("2", nulo, "3", "1")).comienzo(); .

O

nuevo hilo (nueva 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 

    } 



} 
0

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. Este es aunque como las ramas eliminadas, pero en general no lo consideramos rama.

De manera similar cuando hay al menos dos hilos lo llamamos programa de subprocesos múltiples. Si los hilos se reducen, el mínimo sigue siendo uno. Hola programa es un programa de un solo hilo, pero nadie necesita saber multi-threading para escribir o ejecutarlo.

En palabras simples cuando no se dice que un programa tiene hilos, significa que el programa no es un programa de subprocesos múltiples, más que en el sentido literal, es un programa de subprocesos único, en el que PUEDE poner su código como si tuviera múltiples hilos.

A continuación se proporciona un código inútil, pero será suficiente para eliminar algunas confusiones sobre Runnable. Imprimirá "Hello World".

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(); 
    } 
} 
0

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

No. nuevo Runnable no crea el segundo Thread.

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

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

Si Handler está asociado con UI Thread, Runnable ejecuta en UI Thread.

Si Handler se asocia con otros HandlerThread, pistas Ejecutable en HandlerThread


Para Handler explícitamente asociado a su TrenzadoPrincipal (hilo de interfaz de usuario), escriba debajo de código.

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

Si escribe como sigue, utiliza HandlerThread Looper.

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

Cuestiones relacionadas