новый Runnable (), но нет нового потока? - PullRequest
18 голосов
/ 27 января 2012

Я пытаюсь понять код здесь , в частности, анонимный класс

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

В статье говорится

Обработчик запускает код обновления как часть вашего основного потока, избегая накладных расходов второго потока.

Разве создание нового класса Runnable не должно создавать новый второй поток? Для чего здесь класс Runnable, кроме возможности передавать класс Runnable в postAtTime?

Спасибо

Ответы [ 8 ]

45 голосов
/ 27 января 2012

Runnable часто используется для предоставления кода, который должен запускать поток, но сам Runnable не имеет ничего общего с потоками.Это просто объект с методом run().

. В Android класс Handler можно использовать для запроса фреймворка на запуск некоторого кода позже в том же потоке , , а нена другой.Runnable используется для предоставления кода, который должен быть запущен позже.

27 голосов
/ 27 января 2012

Если вы хотите создать новый Thread ... вы можете сделать что-то вроде этого ...

Thread t = new Thread(new Runnable() { public void run() { 
  // your code goes here... 
}});
16 голосов
/ 27 января 2012

Интерфейс Runnable - это еще один способ реализации многопоточности, отличный от расширения класса Thread, поскольку Java позволяет расширять только один класс.

Однако вы можете использовать конструктор new Thread (Runnable runnable) , что-то вроде этого:

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();
11 голосов
/ 09 июля 2014

Вы можете создать поток следующим образом:

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

                       }
                    });
                thread.start();

Также вы можете использовать Runnable, Asyntask, Timer, TimerTaks и AlarmManager для исключения потоков.

7 голосов
/ 27 января 2012

Runnable - это просто интерфейс, который обеспечивает метод run.Потоки являются реализациями и используют Runnable для вызова метода run ().

2 голосов
/ 04 октября 2017

Разве создание нового класса Runnable не должно создавать новый второй поток?

Нет.new Runnable не создает второй Thread.

Для чего здесь класс Runnable, кроме возможности передавать класс Runnable в postAtTime?

Runnable опубликовано на Handler.Эта задача выполняется в потоке, который связан с Handler.

Если Handler связан с потоком пользовательского интерфейса, Runnable выполняется в потоке пользовательского интерфейса.

Если Handler имеет значениесвязанный с другими HandlerThread, Runnable запускается в HandlerThread


Чтобы явно связать Handler с вашим MainThread (потоком пользовательского интерфейса), напишите ниже код.как показано ниже, он использует HandlerThread Looper.

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

0 голосов
/ 24 июня 2017

Поток - это что-то вроде ветки. Разветвленный означает, когда есть по крайней мере две ветви. Если ветви уменьшаются, то минимум остается один. Это похоже на удаление веток, но в целом мы не считаем его ветвью.

Точно так же, когда есть хотя бы два потока, мы называем это многопоточной программой. Если нити уменьшены, минимум остается один. Программа Hello - это однопотоковая программа, но никому не нужно знать многопоточность, чтобы написать или запустить ее.

Проще говоря, когда программа не имеет потоков, это означает, что программа не является многопоточной, более того, в истинном смысле это однопоточная программа, в которую ВЫ МОЖЕТЕ поместить свой код если он многопоточный.

Ниже приведен бесполезный код, но этого будет достаточно, чтобы покончить с некоторыми заблуждениями насчет Runnable. Будет напечатано «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 голосов
/ 17 декабря 2016

Лучший и простой способ - просто передать аргумент и создать экземпляр и вызвать метод потока

Вызвать поток, используя объект потока, и отправить объект класса runnable с параметром или безпараметр и метод запуска объекта потока.

В моем состоянии я отправляю параметр и буду использовать метод запуска.

новый поток (новый FCMThreadController ("2"), null, "3", "1")). start ();

ИЛИ

new 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

    }



}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...