您的位置:首页 > 移动开发 > Android开发

Android之ExecutorService线程池

2016-11-10 22:19 295 查看


如果程序需要异步处理耗时操作,我们通常会新建一个子线程,在子线程完成处理后,通过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理解及应用场景
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: