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