2012-01-27 78 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()); 

相關問題