2014-11-06 125 views
8
private ExecutorService exec = Executors.newSingleThreadExecutor(r -> { 
    Thread t = new Thread(r); 
    t.setDaemon(true); // allows app to exit if tasks are running 
    return t ; 
}); 

我理解執行者背後的想法,但參數r令我困惑。我用:難以理解Java 8 Lambda

final ExecutorService exec = Executors.newSingleThreadExecutor(r -> { 
     Thread t = new Thread(r); 
     System.out.println("Class of r: " + r.getClass()+ ". r to string: " + r.toString()); 
     System.out.println("Class of t: " + t.getClass() +". Name of t: "+ t.getName()); 
     t.setDaemon(true); 
     return t; 
    }); 

深入挖掘,其結果是:

Class of r: class java.util.concurrent.ThreadPoolExecutor$Worker. r to string: [email protected][State = -1, empty queue] 
Class of t: class java.lang.Thread. Name of t: Thread-3 

r被作爲一個參數對Thread對象構造通過。

  1. 簡單字母r如何表示傳遞的對象是ThreadPoolExecutor
  2. 如果ThreadPoolExecutor不按Thread's構造函數的要求執行RunnableThreadPoolExecutor如何作爲參數通過?

如果有人能爲我提供非lambda版本的代碼,那對我的理解會有很大的好處。

回答

15

newSingleThreadExecutor將ThreadFactory作爲參數。 ThreadFactory定義了一個方法newThread,它將Runnable作爲參數並返回一個線程。

拉姆達可能更有意義給你,如果我們指定的r類型明確:

(Runnable r) -> { 
    Thread t = new Thread(r); 
    return t; 
} 

現在是比較明顯的,這是爲了newThread身體的定義。

除了由於lambda立即作爲參數傳遞給接受ThreadFactory的方法,編譯器能夠推斷出r的類型必須爲Runnable。因此可以省略。

沒有拉姆達,該代碼轉換爲下面的匿名類的定義和實例:

private ExecutorService exec = Executors.newSingleThreadExecutor(
    new ThreadFactory() { 
     @Override 
     public Thread newThread(Runnable r) { 
      Thread t = new Thread(r); 
      t.setDaemon(true); 
      return t; 
     } 
    } 
); 

如何簡單的字母r表示所傳遞的對象是ThreadPoolExecutor

r的類型是Runnable,因爲lambda表達式的目標類型以這種方式定義了它的單個方法。

您看到的對象實際上是ThreadPoolExecutor$Worker,它是實現Runnable的ThreadPoolExecutor的私有內部類。

如何爲需要ThreadPoolExecutor差強人意,如果它沒有實現Runnable參數由通過Thread的構造?

參見上面(r是一個Runnable)。

+0

謝謝,Radiodef。我現在完全理解代碼。我在哪裏可以瞭解更多關於'outerclass $ innerclass'類型的記法 - Java語言規範? – user465001 2014-11-06 03:40:31

+2

我很高興解釋它。學習'$'也沒有更多。當您在代碼中引用嵌套類或內部類時使用'Outer.Inner',但通常將其編譯爲名爲'Outer $ Inner'的類。 '$'是所有標識符的有效字符,但通常認爲它是爲內部機制保留的。 http://stackoverflow.com/q/7484210/2891664 – Radiodef 2014-11-06 03:44:38

+0

再次感謝Radiodef! – user465001 2014-11-06 03:58:28