2014-10-03 59 views
3

我指的僵局代碼,看到這個網站線程構造函數如何直接接受運行方法?

http://www.javatpoint.com/deadlock-in-java

我看到了Java API,但找不到任何這樣的主題構造和仍然不知道這是怎麼被在Eclipse IDE編譯?

Thread t1 = new Thread() { 

    public void run() { 
     synchronized (resource1) { 
      System.out.println("Thread 1: locked resource 1"); 

      try { Thread.sleep(100);} catch (Exception e) {} 

      synchronized (resource2) { 
       System.out.println("Thread 1: locked resource 2"); 
      } 
     } 
    } 
}; 

線程構造函數如何直接接受run方法?

回答

4

構造並不接受一個run方法(例如,作爲參數),該代碼被創建匿名類,見this tutorial。在幕後,創建了一個沒有名字的類(匿名類),該類從Thread派生並覆蓋了run方法;那麼將創建該類的一個實例並將其分配給變量t1


只是爲了保持完整性,但:從Java 8中,它是可能Thread構造函數(實際上)接受run函數作爲參數,因爲Java的8位的lambda函數。這看起來是這樣的:

Thread t = new Thread(() -> { 
     System.out.println("Running"); 
    }); 

這是可能的,因爲Thread有一個構造函數接受Runnable實例,Runnable功能接口(一個接口,只定義了單一的功能),所以你可以創建一個實例只需使用lambda來實現該接口,然後將其傳遞給Thread構造函數。有關於lambdas here的教程。但這不是引用的代碼所做的。

下面是一個使用拉姆達而不是一個匿名類的在你的問題中的代碼:

Thread t1 = new Thread(() -> { 
    synchronized (resource1) { 
     System.out.println("Thread 1: locked resource 1"); 

     try { Thread.sleep(100);} catch (Exception e) {} 

     synchronized (resource2) { 
      System.out.println("Thread 1: locked resource 2"); 
     } 
    } 
}); 
+0

這是不正確的,匿名類沒有名字。它是自動生成的名稱,您可以通過反射找到它。示例'AnonymousName $ 1' – 2014-10-03 08:12:18

+1

@ T.G:是的,但這是一個實現細節。高層次,他們沒有名字;如果這不是意圖的話,他們不會被稱爲匿名類(匿名意味着「無名」)。 – 2014-10-03 08:20:57

+0

@ T.J。克勞德:那是真的。我只是想,值得一提的是,他們的名字存在:) – 2014-10-03 08:26:55

相關問題