執行緒建立到底浪有多大消耗
阿新 • • 發佈:2018-12-31
Android開發中多執行緒是我們開發中普遍用到的技術,我們知道啟動一個執行緒是一個很重量級的操作,不僅會引起上下文的切換而進入核心空間,而且在使用者空間的消耗也是很大的。不過這個消耗只是一個在概念上的意識,具體對資源消耗多大一直麼有測試過。今天寫了一個程式碼測試了一下。
這段程式碼是在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; } }
測試資料:
這是建立一個執行緒的消耗:大概消耗了2K記憶體空間,457764納秒 基本相當於執行了6000個++(在if中有個i<1000的判斷 也大概相當於一次++指令)指令。