淺談new Runnable(){}--new Interface(){}
阿新 • • 發佈:2019-02-11
在java多執行緒中實現多執行緒的方式有兩種①extends Thread ②implements Runnable。這兩種情況是我們最常見的,還有一種是由第二種變形而來的直接new Runnable(){},我寫這篇部落格的目的是來將new Runnable(){}中的機制理一理,讓讀者更清晰地理解new Runnable(){},下面我就通過程式碼來將問題演示。
package com.cph.Thread;
public class Text2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Runnable runnable=new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("i am new Runnable(){xxx}");
}
};
Thread thread=new Thread(runnable);
thread.start();
}
}
這段程式碼不會出現什麼問題,控制檯會輸出:i am new Runnable(){xxx} 但如果java基礎紮實一點的朋友,就會疑問Runnable()是介面,我們都知道java的介面是不可以例項化的,但程式碼中的new Runnable(){xxx}確是例項化了,為什麼? 介面和抽象類不可以例項化是對的,這個是java語法規範來的,**而new Runnable(){}其實不是例項化Runnable介面來的,實際上一種內部類的一種簡寫** 在這裡: ①首先構造了一個”implements Runnable “的無名local內部類(方法內的內部類) ②然後構造了這個無名local內部類的一個例項 ③然後用Runnable來表示這個無名local內部類的type(OO多型)。 例如上面這段程式碼編譯後你會看到其實是編譯了兩個類來的,如下:
其中Text2$1就是無名local內部內類,這個也就很好地解釋了為什麼在main()方法中new Runnable(){xxx}裡面的呼叫main()方法中的變數的時候要用final關鍵字來修飾。
上面只是藉助new Runnable(){xxx}特例來說明介面在方法中new的機制,對其他介面同理可得。