ThreadPoolExecutor

CachedThreadPool
只有非核心线程,且总线程数量不固定,当任务到来时,有空闲线程,就立即交由该线程去处理任务,否则就立即创建新线程去处理该任务,保证第一时间执行任务。但空闲线程有超时机制,空闲超过60秒,就会被系统回收。适合执行量大耗时少的任务。
FixThreadPool
只有核心线程,并且数量固定的,也不会被回收。当所有线程都活动时,因为队列没有限制大小,新任务会等待执行。由于线程不会回收,FixThreadPool会更快地响应外界请求。
SingleThreadPool
只有一个核心线程,能够确保所有任务都在同一线程中按顺序完成。因此不需要处理线程同步的问题。
ScheduledThreadPool
拥有固定数量核心线程数量和不固定的非核心线程数量的线程池,4个里面唯一一个有延迟执行和周期重复执行的线程池。

使用方式(以newCachedThreadPool举例)

ExecutorService executo = Executors.newCachedThreadPool();
executor1.execute(new Runnable() {@Overridepublic void run() {......}
});

AsyncTask

// 1.doInBackground方法中参数的类型
// 2.onProgressUpdate方法参数的类型
// 3.doInBackground方法的返回值类型,也是onPostExecute方法的参数的类型
class LoadDataAsyncTask extends AsyncTask<String, Integer, List<Integer>>{// 运行在UI线程,且在doInBackground方法运行前执行@Overrideprotected void onPreExecute() {super.onPreExecute();}// 在子线程中执行,且方法的执行结果会作为参数传入onPostExecute方法中@Overrideprotected List<Integer> doInBackground(String... strings) {List<Integer> a = new ArrayList<>();return a;}@Overrideprotected void onProgressUpdate(Integer... values) {super.onProgressUpdate(values);}// 运行在UI线程,且在doInBackground方法运行结束后执行@Overrideprotected void onPostExecute(List<Integer> list) {super.onPostExecute(list);}
}

调用方式

LoadDataAsyncTask task = new LoadDataAsyncTask();
String param = "qqqq";
// 这个方法通常和THREAD_POOL_EXECUTOR一起使用,允许多个任务在线程池中异步并发执行
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, param);
// execute方法实际内部调用的是executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, params)
// 把多个线程按串行的方式执行,所以是同步执行的,也就是说,只有当一个线程执行完毕之后,才会执行下个线程。
task.execute(param);

Handler

Handler是一套 Android 消息传递机制 / 异步通信机制。

  • 为什么要用 Handler消息传递机制
    答:多个线程并发更新UI的同时 保证线程安全。

背景:在Android开发中为了UI操作是线程安全的,规定只允许UI线程里操作UI组件。
冲突:在实际操作开发中,存在多个线程并发操作UI组件的情况,因而会导致UI操作的线程不安全。
需求:因为上面的冲突产生新的需求,多个线程既可以并发操作UI组件,又能保证线程安全。
解决方案:Handler消息传递机制,即工作线程需要通知UI时,全部通过Handler通知主线程,从而在主线程操作UI。
所以,Handler就是在多线程的应用场景中,将工作线程中需更新UI的操作信息传递到UI主线程,使得主线程可根据工作线程的需求更新UI,从而实现工作线程对UI的更新处理,并避免线程操作不安全的问题,最终实现异步消息的处理。

使用方式
1、在主线程中创建Handler实例。
2、通过两种方式通知UI线程:Handler.sendMessage()、Handler.post()。这两种方式实质都是通过调用sendMessageDelayed(@NonNull Message msg, long delayMillis)来实现的。

sendMessage方式

Handler handler = new Handler(Looper.myLooper()) {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);switch (msg.what) {case 111:}}
};
Message message = new Message();
message.what = 111;
message.obj = new Date();
handler.sendMessage(message);

post方式

Handler handler = new Handler(Looper.myLooper());
handler.post(new Runnable() {@Overridepublic void run() {}
});

Handler还可以用来延迟执行任务。

Android常用多线程相关推荐

  1. Android常用面试题大全

    1.TCP和UDP之间的区别?什么是URL ? TCP被称为用户数据报协议;UDP被称为信息传输控制协议;URL被称为统一资源定位符,通过统一资源定位符可以唯一定位到互联网上的某个资源(图片.视频.音 ...

  2. android 常用框架整理

    文章目录 UI 框架 WebView 框架 具体内容 UI 卫星菜单 节选器 下拉刷新 模糊效果 HUD与Toast 进度条 UI其他 动画 网络相关 网络连接 网络测试 图像获取 响应式编程 地图 ...

  3. Android 常用开源总结

    Android 常用开源库总结 引自  http://www.apkbus.com/blog-977630-79771.html Tag: 前言 收集了一些比较常见的开源库,特此记录(已收录350+) ...

  4. Android面试题大全,2021最新Android常用开源库总结

    Broadcast Receiver面试题 1.Broadcast Receiver是什么 Broadcast是四大组件之一,是一种广泛运用在应用程序之间传输信息的机制,通过发送Intent来传送我们 ...

  5. Android常用酷炫控件(开源项目)github地址汇总

    转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...

  6. 9款Android常用的快速开发框架

    9款Android常用的快速开发框架 Android   2015-08-24 11:05:08 发布 您的评价:       0.0 收藏     0收藏 1.Afinal框架 项目地址:https ...

  7. Android常用面向对象设计模式

    对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是必须的,因为设计模式在Android源码 ...

  8. android开发获取应用本身耗电量_别找了,Android常用自动化工具全在这儿了!

    Android常用自动化工具 ADB - 是Google提供的为Android编写UI测试用例的自动化工具, Android开发/测试人员不可替代的强大工具 uiautomator - 是Google ...

  9. Android之多线程工作-AsyncTask与handler

    本文主要讲解下AsyncTask的使用以及Handler的应用 首先,我们得明确下一个概念,什么是UI线程.顾名思义,ui线程就是管理着用户界面的那个线程! android的ui线程操作并不是安全的, ...

最新文章

  1. java TreeMap用法
  2. Java各种数据类型详细介绍及其区别
  3. 用python计算ln函数_python-含参函数
  4. 神经网络中的 Dropout 以及变体方法
  5. 商务英语计算机,BEC商务英语
  6. Method for Discovering Network Topology中文翻译【Z-Stack Home 1.2.0开发文档】
  7. 20155225 2006-2007-2 《Java程序设计》第四周学习总结
  8. vue获取table一列数据_vue中比较重要的小知识点
  9. Spring学习总结(1)- IOC
  10. 张正友标定法matlab,张正友标定法(相机标定)
  11. CSS 深入理解absolute
  12. 何为血缘分析?血缘分析能给我们带来什么影响?
  13. antdownload百度网盘下载器、下载不限速
  14. 数字后端——信号完整性分析
  15. 榆熙电商:在拼多多开网店如何计算产品价格弹性区间?
  16. mysql 5.7.22 winx64_MySQL 5.7.22 winx64 安装配置方法图文教程
  17. 实时高分辨率视频抠像
  18. iOS设计:绘图及性能
  19. php realpath 缓存,PHP的Realpath Cache
  20. 【ML】Mean-Shift 原理 + 实践(基于sklearn)

热门文章

  1. 又有大厂员工连续加班倒下/ 百度搜狗取消快照/ 马斯克生父不为他骄傲...今日更多新鲜事在此...
  2. 【技术】nuxt中引入wow和animate.css随页面滚动出现动画
  3. 2022年10月29日 20点 程序爱生活 纳指和恒指可能会小破前高,然后有概率继续破新低,但是破完就需要考虑一次较大级别反弹的概率了! 第一次不再完全看空!
  4. 银行数据中台的数据价值,银行数据中台建设实践案例
  5. python队列get不到数据_Python队列.get(block=true)添加项时不返回超时
  6. 吃鸡 python开发_python青少年编程第三季——14、吃鸡联盟之亚瑟开枪(上)
  7. 手游显示服务器繁忙,吃鸡显示一个错误然后就服务器繁忙 | 手游网游页游攻略大全...
  8. python脚本编写bat_推荐10个关于BAT脚本的实例教程
  9. 微信支付宝刷脸支付积极助力行业效率提升
  10. 游戏外挂开发系列--游戏喊话器