wake-up-neo.com

neues Runnable () aber kein neuer Thread?

Ich versuche den Code hier zu verstehen, insbesondere die anonyme Klasse

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

Der Artikel sagt 

Der Handler führt den Aktualisierungscode als Teil Ihres Hauptthreads aus, um den Aufwand eines zweiten Threads zu vermeiden.

Sollte das Erstellen einer neuen Runnable-Klasse nicht einen neuen zweiten Thread erstellen? Was ist der Zweck der Runnable-Klasse hier, abgesehen davon, dass Sie eine Runnable-Klasse an postAtTime übergeben können?

Vielen Dank

18
sgarg

Runnable wird häufig verwendet, um den Code bereitzustellen, den ein Thread ausführen soll, aber Runnable selbst hat nichts mit Threads zu tun. Es ist nur ein Objekt mit einer run()-Methode.

In Android kann die Handler-Klasse verwendet werden, um das Framework aufzufordern, den Code später im selben - Thread auszuführen, anstatt in einem anderen. Runnable wird verwendet, um den Code bereitzustellen, der später ausgeführt werden soll.

45
Wyzard

Wenn Sie ein neues Thread... erstellen möchten, können Sie so etwas tun ...

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

Die Runnable-Schnittstelle ist eine weitere Möglichkeit, Multithreading zu implementieren, außer die Thread-Klasse zu erweitern, da in Java nur eine Klasse erweitert werden kann.

Sie können jedoch den Konstruktor new Thread (Runable Runable) verwenden.

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();
16
npinti

Sie können einen Thread wie folgt erstellen:

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

                       }
                    });
                thread.start();

Sie können auch Runnable, Asynctask, Timer, TimerTask und AlarmManager verwenden, um Threads auszuführen.

11
Victor Ruiz C.

Runnable ist nur eine Schnittstelle, die die Methode run ..__ bereitstellt. Threads sind Implementierungen und verwenden Runnable, um die Methode run () aufzurufen.

7
Matthias Bruns

Sollte das Erstellen einer neuen Runnable-Klasse nicht einen neuen zweiten Thread erstellen? 

No Runnable erstellt keine zweite Thread.

Was ist der Zweck der Runnable-Klasse hier, abgesehen davon, dass Sie eine Runnable-Klasse an postAtTime übergeben können?

Runnable wird an Handler gesendet. Diese Task wird in dem Thread ausgeführt, der Handler zugeordnet ist.

Wenn Handler dem UI-Thread zugeordnet ist, wird Runnable im UI-Thread ausgeführt.

Wenn Handler anderen HandlerThread zugeordnet ist, wird Runnable in HandlerThread ausgeführt.


Um den Handler explizit Ihrem MainThread (UI-Thread) zuzuordnen, schreiben Sie den folgenden Code.

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

Wenn Sie wie folgt schreiben, wird HandlerThread Looper verwendet.

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

1
Ravindra babu

Der beste und einfachste Weg besteht darin, das Argument zu übergeben und eine Instanz zu erstellen und .__ aufzurufen. Thread-Methode

Rufen Sie den Thread mit create eines Thread-Objekts auf und senden Sie ein ausführbares Klassenobjekt mit Parameter oder ohne Parameterund Startmethode des Thread-Objekts.

In meinem Zustand sende ich Parameter und verwende die Methode run.

neuer Thread (neuer FCMThreadController ("2", null, "3", "1")). start ();

OR

neuer Thread (new 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
Sameer Kazi

Ein Thread ist so etwas wie ein Zweig. Mehrfach verzweigt bedeutet, wenn mindestens zwei Zweige vorhanden sind. Wenn die Zweige reduziert werden, bleibt das Minimum eins. Dieses ist zwar wie die entfernten Zweige, aber im Allgemeinen betrachten wir es nicht als Zweige.

Wenn es mindestens zwei Threads gibt, bezeichnen wir es als Multithread-Programm. Wenn die Threads reduziert werden, bleibt das Minimum eins. Hallo Programm ist ein Single-Threaded-Programm, aber niemand muss Multi-Threading kennen, um es zu schreiben oder auszuführen. 

In einfachen Worten, wenn von einem Programm nicht gesagt wird, dass es Threads hat, bedeutet dies, dass das Programm kein Multithread-Programm ist, sondern im wahrsten Sinne des Wortes ein Einzelthread-Programm, in das Sie Ihren Code so einfügen können, als wäre er Multi-Threaded.

Nachfolgend wird ein unbrauchbarer Code angegeben, aber es reicht aus, um Ihre Verwirrungen über Runnable zu beseitigen. Es wird "Hello World" gedruckt.

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
Harjit Singh