Новый Runnable(), но не новый поток?
Я пытаюсь понять код здесь, в частности анонимный класс
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?
Спасибо
Ответы
Ответ 1
Runnable
часто используется для предоставления кода, который должен выполняться потоком, но Runnable
сам по себе не имеет ничего общего с потоками. Это просто объект с методом run()
.
В Android класс Handler
можно использовать, чтобы попросить фреймворк запустить некоторый код позже в том же потоке, а не на другом. Runnable
используется для предоставления кода, который должен запускаться позже.
Ответ 2
Если вы хотите создать новый Thread
... вы можете сделать что-то вроде этого...
Thread t = new Thread(new Runnable() { public void run() {
// your code goes here...
}});
Ответ 3
Интерфейс 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();
Ответ 4
Вы можете создать поток именно так:
Thread thread = new Thread(new Runnable() {
public void run() {
}
});
thread.start();
Кроме того, вы можете использовать Runnable, Asyntask, Timer, TimerTaks и AlarmManager для исключения потоков.
Ответ 5
Runnable - это просто интерфейс, который обеспечивает запуск метода.
Потоки являются реализациями и используют Runnable для вызова метода run().
Ответ 6
Лучший и простой способ - просто передать аргумент и создать экземпляр и вызвать метод потока
Вызовите поток, создав объект потока, и отправьте объект класса runnable с параметром или без параметра и начните метод объекта потока.
В моем состоянии я отправляю параметр, и я буду использовать его в методе run.
new Thread (новый FCMThreadController ( "2", null, "3", "1" )). start();
ИЛИ
Новая тема (новый 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
}
}
Ответ 7
Нить - это что-то вроде некоторой ветки. Многоразветвленное означает, что есть как минимум две ветки. Если ветки уменьшены, то минимум остается одним. Этот, хотя ветки удалены, но в общем случае мы не рассматриваем его ветвь.
Аналогично, если есть хотя бы два потока, мы называем это многопоточной программой. Если потоки уменьшены, минимальный остается одним. Программа 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();
}
}
Ответ 8
Не следует ли создавать новый класс Runnable для создания нового второго потока?
Нет. новый Runnable
не создает второй Thread
.
Какова цель класса Runnable здесь, кроме возможности передать класс Runnable postAtTime?
Runnable
отправляется на Handler
. Эта задача выполняется в потоке, который связан с Handler
.
Если Handler
связан с потоком пользовательского интерфейса, Runnable
работает в потоке пользовательского интерфейса.
Если Handler
связано с другим HandlerThread
, Runnable работает в HandlerThread
Чтобы явно связать Handler с вашим MainThread (потоком пользовательского интерфейса), напишите ниже код.
Handler mHandler = new Handler(Looper.getMainLooper();
Если вы пишете, как показано ниже, он использует HandlerThread Looper.
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
Handler requestHandler = new Handler(handlerThread.getLooper());