2015-01-13 93 views
1

我無法理解下面的代碼來創建Runnable對象。可能有人請解釋清楚這裏發生了什麼:是否可以在java中爲Runnable接口創建對象

public class ThreadStart { 
    public static void main(String[] args) { 
    Thread t1 = new Thread(new Runnable() { 
     @Override 
     public void run() { 
     for(int i=0;i<5;i++) { 
      System.out.println(i+" runnable thread..."); 
     } 
     } 
    }); 
    t1.start(); 
    } 
} 
+0

檢查匿名類在Java – Sashwat

回答

3

想象一下Runnable的以下實現。一個實現接口的簡單類。

public class MyRunnable implements Runnable { 
    @Override 
    public void run() { 
     for (int i = 0; i < 5; i++) { 
      System.out.println(i + " runnable thread..."); 
     } 
    } 
} 

因此,爲了創造你Thread的方式,你意,你必須提供一個Runnable目標的實現。有多種方法可以實現這一點。

最直接的方法或許是從上方使用Runnable的實例:

Thread t1 = new Thread(new MyRunnable()); 

到另一種方法是直接提供Runnable在碼作爲匿名內部類它們可以對了解有關here的更多信息。

一個匿名內部類僅僅意味着你在代碼中創建一個類作爲表達式來使用它 - 類必須遵循相同的簽名(即在這種情況下它實現Runnable接口)。

Thread t2 = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     for (int i = 0; i < 5; i++) { 
      System.out.println(i + " runnable thread..."); 
     } 
    } 
}); 

Oracle Docs

匿名類表達包括以下:

  • 的新的運營商
  • 的接口的名稱來實現或類來擴展。在這個例子中,匿名類正在實現接口HelloWorld。
  • 括號包含構造函數的參數,就像普通的類實例創建表達式一樣。注意:當你實現一個接口時,沒有構造函數,所以你使用一對空括號,就像這個例子。
  • 身體,這是一個類聲明的主體。更具體地說,在主體中,方法聲明是允許的,但聲明不是。

所以,基本上你在做什麼是傳遞一個RunnableThread構造。如果您將它作爲匿名類傳遞,則只需將它作爲表達式傳遞給實際定義整個內部類的表達式即可。

此外,在Java 8,你可以用這樣的lambda表達式替換匿名內部類:

Thread t3 = new Thread(() -> { 
    for (int i = 0; i < 5; i++) { 
     System.out.println(i + " runnable thread..."); 
    } 
}); 
+0

謝謝Wassgren的回答。 – Balasubramani

+0

@Balasubramani沒問題,我希望它有幫助! – wassgren

4

此代碼創建一個匿名類的一個實例(這意味着它沒有名字)實現了Runnable接口。這個實例被傳遞給Thread類的構造函數。

1

該代碼使用匿名類。您可以瞭解有關匿名課程here的所有信息。

基本上這意味着你要創建一個類,實現Runnable通過直接實現方法到您的方法調用。

0

你正在創建一個匿名內部類工具Runnable接口的實例。如果您轉到.class文件所在的目錄,則可以看到使用名稱ThreadStart$1.class創建的匿名類。即,OuterClass$1.class

0

您使用Anonymous class實現Runnable接口,並傳遞到您的線程構造函數接受Runnable

匿名類

匿名類讓你讓你的代碼更簡潔。它們使您能夠同時聲明和實例化一個類。除了沒有名字之外,它們就像本地的課程。如果您只需要使用一次本地課程,請使用它們。

相關問題