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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值