Android里的多线程知识点
1.Thread类与Runnable接口
子类继承Thread类实现跑自己逻辑的run方法,在调用Thread类的start方法后,会自动调用run方法,该对象只可以调用一次start方法,即Thread类对象的作用就是另起一个线程跑一段代码
跑的这段代码既可以放在Thread子类里,也可以放在实现了Runnable接口的类里,这样更灵活(资源共享)
Runnable接口则定义在libcore/luni/src/main/java/java/lang/Runnable.java,本身很简单,只有一个run方法,代表可以执行的对象,实现了该接口的类可以作为参数传给Thread类的构造函数,然后调用该Thread对象的start方法即可自动调用被实现了的run方法(Interface Segregation Principle)
一般都实现Runnable接口,好处一是不用继承Thread类,Java是单继承,所以要用接口;二是不同的线程之间可以共享资源(同一份变量都可以访问),Thread类的同对象不可以多次调用start方法,而实现了Runnable接口的对象可以多次传给不同的Thread类对象来通过start调用run方法
最后强调一下,我们的目的是要一段代码在多个线程里跑,用Thread子类的方法把代码承载在Thread子类上,导致要有多个Thread子类对象,无法是代码共享子类中的资源;用Runnable接口的办法可以实现资源共享,因为一个实现了该接口的类可以传给多个Thread对象,这是一种解偶,Thread对象只负责开线程,运行该代码即可(Law of Demeter,Single Responsibility Principle)
2.Executor,ExecutorService,Executors,ThreadPoolExecutor
线程池技术,预先创建线程,将创建线程的消耗摊薄在任务上(初始化相应策略的线程池类,分配线程资源,等待执行),并通过不同任务挂靠在池中不同线程上排队解决因请求太多而资源不足的问题
Executor接口代表了执行一段代码,只有一个execute方法,接受Runnable参数,实现这个方法的具体类决定了执行Runnable代码的策略(调度任务的方式和时间)。Executor将任务提交/执行与任务如何运行分离开来
ExecutorService代表了线程池,是个接口,继承于Executor,提供了更丰富的方法开控制异步与并发。用它来为Runnable接口提供并发执行的接口
线程池里的任务一定要手动关闭,Future接口代表异步任务的执行状况
CompletionService及这个接口的具体实现类ExecutorCompletionService用以简化等待任务执行结果的过程
Executors是个类,使用工厂模式创建各种策略的具体线程池(ExecutorService)
Executors只有一个直接实现类ThreadPoolExecutor和间接实现类ScheduledThreadPoolExecutor
ThreadPoolExecutor和ScheduledThreadPoolExecutor是Executors的实现类,提供具体的算法
3.Callable接口
Callable接口与Runnable接口类似,不同的是他是一个泛型接口,要实现call方法,并且可以返回对象,抛出checked异常
Callable接口与Future接口,FutrueTask结合使用结合在一起可以获得一个Future类,用以查询状态,取消执行,获得执行结果
ExecutorService的submit方法可传入一实现Callable接口的对象,自动执行里边的call函数
4.Handler
Android有个特性,UI控件不让在主线程之外的线程修改,所以引入Handler机制,来实现线程之间的通信
Handler与new它的线程绑定(每个handler关联了一个线程),其他线程通过sendMessage发送消息给Handler来处理相应消息下的代码;或者是post发法发送一段代码(Runnable对象)给Handler,让其自动调用其中的run方法,run方法里有相关交互逻辑
与Handler相关的类还有Message,MessageQueue,Looper
Message有what,arg1,arg2,obj,setData,getData等方法与域
Message放在MessageQueue里,Loop会循环等待读取MessageQueue里的Message,发送给Handler来处理
Android里的多线程知识点的更多相关文章
- Android Learning:多线程与异步消息处理机制
在最近学习Android项目源码的过程中,遇到了很多多线程以及异步消息处理的机制.由于之前对这块的知识只是浅尝辄止,并没有系统的理解.但是工程中反复出现让我意识到这个知识的重要性.所以我整理出这篇博客 ...
- Java Native Interface 五 JNI里的多线程与JNI方法的注册
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI里的多线程 在本地方法里写有关多线程的 ...
- 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式
注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...
- Android四个多线程分析:MessageQueue实现
Android四个多线程分析:MessageQueue的实现 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前面两篇文章<Android多线 ...
- Android里使用正則表達式
在Android里怎样使用正則表達式: 以验证username为例.username一般字母开头,同意字母数字下划线.5-16个字节: String regEx = "^[a-zA-Z][a ...
- Android中的多线程【转】
感谢大佬:https://www.cnblogs.com/zoe-mine/p/7954605.html 感谢大佬:https://blog.csdn.net/u014555121/article/d ...
- Android 开发必备的知识点——JVM基础【转】
image 1.JVM与操作系统的关系 Java Virtual Machine JVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机.它能识别 .class ...
- Android中的多线程断点下载
首先来看一下多线程下载的原理.多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序"拼接"起来就 ...
- 转载 Android 多线程处理之多线程用法大集合
handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程. 1.如果像这样,是可以操作ui ...
随机推荐
- 【Dancing Link专题】解题报告
DLX用于优化精确覆盖问题,由于普通的DFS暴力搜索会超时,DLX是一个很强有力的优化手段,其实DLX的原理很简单,就是利用十字链表的快速删除和恢复特点,在DFS时删除一些行和列以减小查找规模,使得搜 ...
- BZOJ 3511 土地划分
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3511 题目分析: 看上去和前面的人员雇佣以及小M种田都很像. 最小割模型来求最大值,一般都 ...
- APM 终端用户体验监控分析(上)
一.前言 理解用户体验是从终端用户角度了解应用交付质量的关键,这是考量业务健康运转的潜在因素.捕获此类数据的方法各种各样,具体的实现途径由应用.基础设施架构以及管理者和管理过程决定. 二.终端用户监控 ...
- POJ 2151 Check the difficulty of problems (概率dp)
题意:给出m.t.n,接着给出t行m列,表示第i个队伍解决第j题的概率. 现在让你求:每个队伍都至少解出1题,且解出题目最多的队伍至少要解出n道题的概率是多少? 思路:求补集. 即所有队伍都解出题目的 ...
- POJ 1656
#include<iostream>//chengdacaizi 08 .11. 12 #include<string> using namespace std; ][]={} ...
- DF学Mysql(三)——Mysql数据类型
Mysql数据类型分为:整数类型.浮点数类型.定点数类型日期与时间类型字符串类型二进制类型 整数类型 字节数 无符号数取值范围 有符号数取值范围TINYINT 1 0-255 -128-127SMAL ...
- 百度面试题——top K算法
需求 从一亿个数据中,找出其中最小的10个数. 分析 最笨的方法就是将这一亿个数据,按从小到大进行排序,然后取前10个.这样的话,即使使用时间复杂度为nlogn的快排或堆排,由于元素会频繁的移动,效率 ...
- JDK环境变量解析
设置环境变量 在java 中需要设置三个环境变量(1.5之后不用再设置classpath了,但个人强烈建议继续设置以保证向下兼用问题)JDK安装完成之后我们来设置环境变量:右击“我的电脑”,选择“属性 ...
- Could not create the driver from NHibernate.Driver.SQLite20Driver
使用NHibernate连接Sqlite语句,版本为.net3.5. 升级.net 4.0出现异常,提示”Could not create the driver from NHibernate.Dri ...
- JAVA面试基础
JAVA相关基础知识1.面向对象的特征有哪些方面 ?1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂 ...