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

sga*_*arg 18 java multithreading android 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));
   }
};
Run Code Online (Sandbox Code Playgroud)

文章说

Handler将更新代码作为主线程的一部分运行,避免了第二个线程的开销.

不应该创建一个新的Runnable类创建一个新的第二个线程?除了能够将Runnable类传递给postAtTime之外,Runnable类的目的是什么?

谢谢

Wyz*_*a-- 46

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

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

  • @ glaz666,`Runnable`文档讨论了线程,因为它们是`Runnable`最常见的*使用,但该接口适用于任何类型的回调.我认为Android`Handler`使用`Runnable`是完全合理的 - 它比定义一个新的特定于Android的界面更好,该界面与`Runnable`相同但名称不同. (15认同)

Sha*_*dne 27

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

Thread t = new Thread(new Runnable() { public void run() { 
  // your code goes here... 
}});
Run Code Online (Sandbox Code Playgroud)

  • 不是OP问的. (4认同)

npi*_*nti 16

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();
Run Code Online (Sandbox Code Playgroud)

  • @shishirgarg:这个例子创建了一个新的 Thread 对象。要执行它,只需像这样调用 `start()` 方法:`thread.start()`。这应该在内部调用 `run()` 方法(注意,你不应该自己调用 `run()` 方法),它会启动线程。 (2认同)

Vic*_*iz. 11

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

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

                       }
                    });
                thread.start();
Run Code Online (Sandbox Code Playgroud)

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


小智 7

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