2012-01-27 79 views
15

我试图理解代码here,特别是匿名类new 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类传递给postAtTime之外,Runnable类的目的是什么?

感谢

+2

号的Runnable不是'Thread's。 http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html – 2012-01-27 06:40:02

回答

41

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

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

+0

“Runnable本身与线程无关”,这在概念上是错误的!请阅读文档。 Runnable接口应该由其实例旨在由线程执行的任何类来实现。当Runnable被传递时,它也令人困惑,但事情发生在同一个线程中。请阅读“最少突击原则”。 – glaz666 2012-12-11 16:36:31

+13

@ glaz666,'Runnable'文档讨论了线程,因为它们是'Runnable'中最常见的用法,但该接口适用于任何类型的回调。我认为Android'Handler'使用'Runnable'完全合理 - 比定义一个与'Runnable'完全相同但名称不同的新Android特定接口要好得多。 – Wyzard 2012-12-12 01:19:36

+0

没有“扩展线程”和“实现可运行”的“new Runnable()”示例: http://docs.oracle.com/javase/tutorial/uiswing/examples/start/HelloWorldSwingProject/src/start/HelloWorldSwing。 java – 2015-12-23 20:58:19

6

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

21

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

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

不是OP要求的。 – alfoks 2015-03-11 14:08:46

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(); 
+0

所以这个例子创建一个新的线程或不是,因为你已经使用线程但不叫做start().. – sgarg 2012-01-27 06:53:41

+1

@shishirgarg:这个例子创建一个新的线程对象。要执行它,只需调用'start()'方法如:'thread.start()'。这应该在内部调用'run()'方法(注意,你不应该自己调用'run()'方法),这会启动线程。 – npinti 2012-01-27 06:55:37

10

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

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

         } 
        }); 
       thread.start(); 

此外,您还可以使用Runnable接口,Asyntask,定时器,TimerTaks和AlarmManager来超越线程。

+0

你可以重写Thread的run()方法。创建Runnable的好处是什么? – 2016-11-25 11:47:53

0

最简便的方法是刚刚通过论证,并创建实例,并使用对象创建一个线程调用 线程方法

电话线,并发送带有参数或可运行的类对象,而参数和启动线程对象的方法。

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

new Thread(new FCMThreadController(“2”,null,“3”,“1”))。开始(); 。

OR

新主题(新FCMThreadController())开始();

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 

    } 



} 
0

线程是类似的一些分支。多分支意味着至少有两个分支。如果分支减少,那么最小值仍然是1。这一个虽然像拆除了分支,但总的来说我们不认为它是分支。

同样,当至少有两个线程我们称之为多线程程序。如果线程减少,最小值仍然为1。你好程序是一个单线程程序,但没有人需要知道多线程来写或运行它。

简而言之,当一个程序没有被说成是有线程时,这意味着该程序不是一个多线程程序,在真正的意义上它是一个单线程程序,在其中你可以把你的代码就好像它是多线程的。

下面给出了一个无用的代码,但它可以解决您对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(); 
    } 
} 
0

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

编号新Runnable不会创建第二个Thread

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

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

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

如果HandlerHandlerThread


要明确关联处理程序到你的MainThread(UI线程)与其他HandlerThread,Runnable的运行相关的,下面写的代码。

Handler mHandler = new Handler(Looper.getMainLooper(); 

如果你写如下,它使用HandlerThread Looper。

HandlerThread handlerThread = new HandlerThread("HandlerThread"); 
handlerThread.start(); 
Handler requestHandler = new Handler(handlerThread.getLooper()); 

相关问题