Java線程池使用引起的一點思考

今天遇到這樣一段代碼,具體業務代碼略掉,只留框架

    ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 20, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue());
    Thread task = new Thread(new Runnable(){
        public void run(){
            //業務代碼,略
        }
    });
    executor.execute(task);

因爲創建線程的成本較高,所以我們使用ThreadPoolExecutor線程池重用線程。上面代碼task每次創建一個線程,這樣不是我們違背使用線程池的初衷,造成資源浪費嗎?

這段代碼引起我的一個思考:Java程序是在new Thread(**)的時候創建線程嗎?

查看JDK源碼,Thread的構造函數沒有創建線程,而是start方法調用一個native的start0方法讓JVM去創建操作系統線程。

    private native void start0();

所以上面的代碼雖然不太優雅,但並不會浪費資源創建線程,最多浪費的是Thread對象佔用的資源。

不過,我們寫代碼時還是通過實現Runnable接口來創建task比較好,這樣代碼清晰,不會讓人疑惑。

因爲我們的代碼除了給機器看,更重要的是給人看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章