如果程序需要异步处理耗时操作,我们通常会新建一个子线程,在子线程完成处理后,通过handler回调通知UI线程刷新页面数据。很多时候我们都会使用new Thread(Runnal对象).start();来处理,今天,给大家介绍一下ExecutorService线程池的用法。
为什么要引入线程池?
1.)new Thread()的缺点
- 每次new Thread()耗费性能
- 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。
- 不利于扩展,比如如定时执行、定期执行、线程中断
2.)采用线程池的优点
- 重用存在的线程,减少对象创建、消亡的开销,性能佳
- 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞
- 提供定时执行、定期执行、单线程、并发数控制等功能
让我们体验一下它的简单用法吧,代码示例:
public class GetTMKActivity extends AppCompatActivity { private TMKManager mTMKManager; private TextView log; private static long lastClick = 0; private ExecutorService executorService; private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 0x1: if (log != null) { log.setText((String) msg.obj); } break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_get_tmk); log = (TextView) findViewById(R.id.result); LogUtil.isLogEnable(true); mTMKManager = new TMKManager(); mTMKManager.onCreate(this); executorService = Executors.newSingleThreadExecutor(); } @Override protected void onDestroy() { super.onDestroy(); mTMKManager.onDestroy(); if (executorService != null) { executorService.shutdownNow(); } } @Override protected void onPause() { super.onPause(); } @Override protected void onResume() { super.onResume(); mTMKManager.onResume(); } private boolean canClick() { if (System.currentTimeMillis() - lastClick > 500) { lastClick = System.currentTimeMillis(); return true; } Toast.makeText(GetTMKActivity.this, "click too fast", Toast.LENGTH_SHORT).show(); return false; } public void clickDo(View v) { if (!canClick()) { return; } switch (v.getId()) { case R.id.ic_getSerialNo: executorService.submit(new Runnable() { @Override public void run() { // 用过Handler的人都知道,Message有两种获取方法: // Message msg = new Message(); 或者 Message msg = handler.obtainMessage(); // 这两种方法的区别是,前者是new的,需要开辟内存空间;后者是从global Message pool中取,性能消耗相对少; Message.obtain(mHandler, 0x1, "serialNo:" + mTMKManager.getICKeyCardHelper().getSerialNo()).sendToTarget(); } }); break; case R.id.ic_getTMK: executorService.submit(new Runnable() { @Override public void run() { Message.obtain(mHandler, 0x1, "tmk:" + mTMKManager.getICKeyCardHelper().getTMK("7dsSJ2mk4LJBv4i9WaoUecjKYvavAHEU")).sendToTarget(); } }); break; case R.id.ic_getTMK2: executorService.submit(new Runnable() { @Override public void run() { Message.obtain(mHandler, 0x1, "Mkey:" + mTMKManager.getICKeyCardHelper().getTransKey()).sendToTarget(); } }); break;} }}
线程管理相关文章地址:
- Android线程管理之Thread使用总结
- Android线程管理之ExecutorService线程池
- Android线程管理之ThreadPoolExecutor自定义线程池
- Android线程管理之AsyncTask异步任务
- Android线程管理之ThreadLocal理解及应用场景