今天遇到這樣一段代碼,具體業務代碼略掉,只留框架
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比較好,這樣代碼清晰,不會讓人疑惑。
因爲我們的代碼除了給機器看,更重要的是給人看。