1. 程式人生 > >淺談new Runnable()

淺談new Runnable()

轉自:https://blog.csdn.net/c_p_h/article/details/70473673?locationNum=1&fps=1

參考:

https://www.cnblogs.com/lanzhi/p/6467266.html //匿名內部類中關於new Runnable()的使用

http://wiki.jikexueyuan.com/project/java-concurrent/creating-and-starting-java-threads.html //如何建立並執行 java 執行緒

https://blog.csdn.net/weixin_35649408/article/details/51992451

 //關於java中的listener回撥機制,以及在Android中的使用

 

在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的機制,對其他介面同理可得。 

匿名內部類(Anonymous Inner Class),在建立例項的同時給出類的定義,所有這些在一個表示式中完成。