1. 程式人生 > >執行緒建立到底浪有多大消耗

執行緒建立到底浪有多大消耗

Android開發中多執行緒是我們開發中普遍用到的技術,我們知道啟動一個執行緒是一個很重量級的操作,不僅會引起上下文的切換而進入核心空間,而且在使用者空間的消耗也是很大的。不過這個消耗只是一個在概念上的意識,具體對資源消耗多大一直麼有測試過。今天寫了一個程式碼測試了一下。

public class MaxThreadTest extends Activity implements OnClickListener {

    ReentrantLock lock;
    int i = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
	// TODO Auto-generated method stub
	super.onCreate(savedInstanceState);
	TextView view = new TextView(this);
	view.setHeight(LayoutParams.MATCH_PARENT);
	view.setWidth(LayoutParams.MATCH_PARENT);
	view.setTextColor(getResources().getColor(android.R.color.black));
	view.setText("hello");
	view.setOnClickListener(this);
	setContentView(view);
	lock = new ReentrantLock();
	lock.lock();
    }

    @Override
    protected void onResume() {
	// TODO Auto-generated method stub
	super.onResume();

    }

    @Override
    public void onClick(View v) {
	// TODO Auto-generated method stub
	StringBuilder stringBuilder = new StringBuilder(i + "\r\n");

	Runtime runtime = Runtime.getRuntime();

	stringBuilder.append("Total:").append(getNum(runtime.totalMemory())).append("\r\n");
	stringBuilder.append("Free:").append(getNum(runtime.freeMemory())).append("\r\n");

	long startTime = Debug.threadCpuTimeNanos();
	new Thread() {
	    public void run() {
		try {
		    lock.lock();
		} catch (Exception e) {

		} finally {
		    lock.unlock();
		}

	    };
	}.start();
	i++;
	long endTime = Debug.threadCpuTimeNanos();
	
	stringBuilder.append("USER:").append((endTime-startTime)+"").append("\r\n");
	stringBuilder.append("Total:").append(getNum(runtime.totalMemory())).append("\r\n");
	stringBuilder.append("Free:").append(getNum(runtime.freeMemory())).append("\r\n");
	
	 startTime = Debug.threadCpuTimeNanos();
	for(int i=0;i<1000;){
	    i++;
	}
	endTime = Debug.threadCpuTimeNanos();
	stringBuilder.append("USER:").append((endTime-startTime)+"").append("\r\n");
	((TextView)v).setText(stringBuilder.toString());

	

    }
    

    /**
     *<p>TODO(概括性描述)</p><br/>
     *<p>TODO(詳細描述)</p>
     * @since 2.6
     * @author liulp
     * @param totalMemory
     * @return
     */
    private String getNum(long totalMemory) {
	// TODO Auto-generated method stub

	return (totalMemory / 1024) + "";
    }
    
    @Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
        super.onBackPressed();
        lock.unlock();
        i=0;
    }
}
這段程式碼是在android平臺上測試的。進入測試頁面後只要點選下頁面就會建立一個執行緒,而執行緒會進入阻塞佇列不會結束。

測試資料:


這是建立一個執行緒的消耗:大概消耗了2K記憶體空間,457764納秒  基本相當於執行了6000個++(在if中有個i<1000的判斷 也大概相當於一次++指令)指令。