繁体   English   中英

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

[英]new Runnable() but no new thread?

我试图理解这里的代码,特别是匿名类

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类的目的是什么?

谢谢

Runnable通常用于提供线程应该运行的代码,但Runnable本身与线程无关。 它只是一个带有run()方法的对象。

在Android中, Handler类可用于要求框架稍后在同一个线程上运行某些代码,而不是在另一个线程上运行。 Runnable用于提供稍后运行的代码。

如果你想创建一个新的Thread ......你可以做这样的事......

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

Runnable接口是另一种可以实现多线程而不是扩展Thread类的方法,因为Java允许您只扩展一个类。

但是,您可以使用新的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();

您可以像这样创建一个线程:

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

                       }
                    });
                thread.start();

此外,您可以使用Runnable,Asyntask,Timer,TimerTaks和AlarmManager来执行线程。

Runnable只是一个接口,它提供了运行方法。 线程是实现并使用Runnable来调用方法run()。

不应该创建一个新的Runnable类创建一个新的第二个线程?

不,新的Runnable不会创建第二个Thread

除了能够将Runnable类传递给postAtTime之外,Runnable类的目的是什么?

Runnable发布到Handler 此任务在与Handler关联的线程中运行。

如果Handler与UI Thread关联,则Runnable在UI Thread中运行。

如果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());

最简单的方法就是传递参数并创建实例和调用线程方法

使用创建线程对象调用线程并使用参数或带参数发送可运行的类对象并启动线程对象的方法。

在我的情况下,我发送参数,我将在run方法中使用。

new Thread(new 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

    }



}

线程就像某个分支。 多分支意味着当存在至少两个分支时。 如果分支减少,则最小值仍为1。 这个虽然像删除了分支,但一般我们不认为它是分支。

同样,当至少有两个线程时,我们将其称为多线程程序。 如果线程减少,则最小值保持为1。 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();
    } 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM