线程创建到底浪有多大消耗

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());

	

    }
    

    /**
     *

TODO(概括性描述)


*

TODO(详细描述)

* @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的判断 也大概相当于一次++指令)指令。


你可能感兴趣的:(android)