我正在尝试理解代码here,特别是匿名类
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));
}
};
文章说
Handler将更新代码作为主线程的一部分运行,避免了第二个线程的开销。
不应该创建一个新的Runnable类来创建一个新的第二个线程吗?除了能够将Runnable类传递给postAtTime之外,Runnable类的目的是什么?
由于
答案 0 :(得分:45)
Runnable
通常用于提供线程应该运行的代码,但Runnable
本身与线程无关。它只是一个run()
方法的对象。
在Android中,Handler
类可用于要求框架稍后在相同的线程上运行某些代码,而不是在另一个上运行。 Runnable
用于提供应该稍后运行的代码。
答案 1 :(得分:27)
如果你想创建一个新的Thread
......你可以做这样的事情......
Thread t = new Thread(new Runnable() { public void run() {
// your code goes here...
}});
答案 2 :(得分:16)
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();
答案 3 :(得分:11)
您可以像这样创建一个线程:
Thread thread = new Thread(new Runnable() {
public void run() {
}
});
thread.start();
此外,您可以使用Runnable,Asyntask,Timer,TimerTaks和AlarmManager来执行线程。
答案 4 :(得分:7)
Runnable只是一个接口,它提供了运行方法。 线程是实现,并使用Runnable来调用方法run()。
答案 5 :(得分:1)
不应该创建一个新的Runnable类来创建一个新的第二个线程吗?
没有。新Runnable
不会创建第二个Thread
。
除了能够将Runnable类传递给postAtTime之外,Runnable类的目的是什么?
Runnable
已发布到Handler
。此任务在线程中运行,该线程与Handler
。
如果Handler
与UI线程相关联,Runnable
将在UI线程中运行。
如果Handler
与其他HandlerThread
相关联,则Runnable会在HandlerThread
中运行
要将Handler显式关联到MainThread(UI线程),请在下面编写代码。
Handler mHandler = new Handler(Looper.getMainLooper();
如果您编写如下,则使用HandlerThread Looper。
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
Handler requestHandler = new Handler(handlerThread.getLooper());
答案 6 :(得分:0)
最简单的方法就是传递参数并创建实例和调用 线程方法
使用创建线程对象调用线程,并使用参数或不带参数发送可运行的类对象,并启动线程对象的方法。
在我的情况下,我发送参数,我将在run方法中使用。
new Thread(new FCMThreadController(“2”,null,“3”,“1”))。start();
OR
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
}
}
答案 7 :(得分:0)
线程就像某个分支。多分支意味着当存在至少两个分支时。如果分支减少,则最小值仍为1。这个虽然删除了分支,但总的来说我们不认为它是分支。
同样,当有至少两个线程时,我们称之为多线程程序。如果线程减少,则最小值保持为1。 Hello程序是一个单线程程序,但没有人需要知道多线程来编写或运行它。
简单来说,当一个程序没有被称为拥有线程时,这意味着该程序不是一个多线程程序,更真实的意义上它是一个单线程程序,你可以将你的代码作为如果它是多线程的。
下面给出了一个无用的代码,但是只要废除一些关于Runnable
的混淆就足够了。它将打印&#34; Hello World&#34;。
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();
}
}