新的Runnable()但没有新的线程?

时间:2012-01-27 06:36:32

标签: java android multithreading runnable

我正在尝试理解代码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类的目的是什么?

由于

8 个答案:

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