Android之ExecutorService线程池

如果程序需要异步处理耗时操作,我们通常会新建一个子线程,在子线程完成处理后,通过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开发ExecutorService是一个用于管理和执行多线程任务的接口。它是Java并发包的一部分,可以帮助开发者更方便地处理并发任务。通过ExecutorService,开发者可以创建线程池,将任务提交给线程池进行执行,并可以控制线程的数量和调度方式。 在引用的示例使用了Executors类的newSingleThreadExecutor()方法创建了一个只有一个线程的线程池。然后通过for循环创建了20个Runnable任务,并使用executorService.execute()方法提交给线程池执行。 在引用的示例使用了Executors类的newCachedThreadPool()方法创建了一个具有缓存的线程池。这意味着线程池的线程数量会根据需要动态地调整。然后通过for循环创建了100个Runnable任务,并使用executorService.execute()方法提交给线程池执行。 在引用的示例使用了Executors类的newScheduledThreadPool()方法创建了一个具有调度功能的线程池。然后通过for循环创建了20个Runnable任务,并使用executorService.schedule()方法将任务延迟5000毫秒后执行。 总之,ExecutorServiceAndroid开发用于管理和执行多线程任务的接口,可以根据需要创建不同类型的线程池,并通过execute()或schedule()方法提交任务给线程池执行。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Android线程管理之ExecutorService线程池](https://blog.csdn.net/dengzou5556/article/details/101607309)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值