【android】深入理解在Android
说完原理,再来看看线程的创建和复用的相关代码(基于 JDK 1.8),如下:
±—ThreadPoolExecutor.Worker.java
Worker(Runnable firstTask) {
setState(-1);
this.firstTask = firstTask;
// 调用线程工厂创建线程
this.thread = getThreadFactory().newThread(this);
}
// Worker 实现了 Runnable 接口
public void run() {
runWorker(this);
}
±—ThreadPoolExecutor.java
final void runWorker(Worker w) {
Thread wt = Thread.currentThread();
Runnable task = w.firstTask;
w.firstTask = null;
w.unlock();
boolean completedAbruptly = true;
try {
// 循环从任务队列中获取新任务
while (task != null || (task = getTask()) != null) {
w.lock();
// If pool is stopping, ensure thread is interrupted;
// if not, ensure thread is not interrupted. This
// requires a recheck in second case to deal with
// shutdownNow race while clearing interrupt
if ((runStateAtLeast(ctl.get(), STOP) ||
(Thread.interrupted() &&
runStateAtLeast(ctl.get(), STOP))) &&
!wt.isInterrupted())
wt.interrupt();
try {
beforeExecute(wt, task);
Throwable thrown = null;
try {
// 执行新任务
task.run();
} catch (RuntimeException x) {
thrown = x; throw x;
} catch (Error x) {
thrown = x; throw x;
} catch (Throwable x) {
thrown = x; throw new Error(x);
} finally {
afterExecute(task, thrown);
}
} finally {
task = null;
w.completedTasks++;
w.unlock();
}
}
completedAbruptly = false;
} finally {
// 线程退出后,进行后续处理
processWorkerExit(w, completedAbruptly);
}
}
####3.2.2 提交任务
通常情况下,我们可以通过线程池的submit
方法提交任务。被提交的任务可能会立即执行,也可能会被缓存或者被拒绝。任务的处理流程如下图所示:
上面的流程图不是很复杂,下面再来看看流程图对应的代码,如下:
±— AbstractExecutorService.java
public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
// 创建任务
RunnableFuture ftask = newTaskFor(task, null);
// 提交任务
execute(ftask);
return ftask;
}
±— ThreadPoolExecutor.java
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
int c = ctl.get();
// 如果工作线程数量 < 核心线程数,则创建新线程
if (workerCountOf© < corePoolSize) {
// 添加工作者对象
if (addWorker(command, true))
return;
c = ctl.get();
}
// 缓存任务,如果队列已满,则 offer 方法返回 false。否则,offer 返回 true
if (isRunning© && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
// 添加工作者对象,并在 addWorker 方法中检测线程数是否小于最大线程数
else if (!addWorker(command, false))
// 线程数 >= 最大线程数,使用拒绝策略处理任务
reject(command);
}
private boolean addWorker(Runnable firstTask, boolean core) {
retry:
for (;
【android】深入理解在Android相关推荐
- Android深入理解Fragment
Fragment 目录 思维导图 概述 设计原因 基本使用 xml 声明 代码设置 添加没有 UI 的 fragment 生命周期 管理 Fragment 和执行事务 与 Activity 通信 常见 ...
- android scaletype没作用,Android源码系列之深入理解ImageView的ScaleType属性
做Android开发的童靴们肯定对系统自带的控件使用的都非常熟悉,比如Button.TextView.ImageView等.如果你问我具体使用,我会给说:拿ImageView来说吧,首先创建一个新的项 ...
- android:layout_with=,android – 难以理解layout_alignWithParentIfMissing
这仅适用于使用RelativeLayout时. 如果您将元素设置为一个其他元素,则表示该元素位于该元素的左侧. 但是如果这个元素会丢失,因为你删除它,例如它将与父对齐. 举个例子 android:la ...
- android自动夜间模式,Android实现日夜间模式的深入理解
在本篇文章中给出了三种实现日间/夜间模式切换的方案,三种方案综合起来可能导致文章的篇幅过长,请耐心阅读. 1.使用 setTheme的方法让 Activity重新设置主题: 2.设置 Android ...
- Android 深入理解Android中的自定义属性
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45022631: 本文出自:[张鸿洋的博客] 1.引言 对于自定义属性,大家肯定 ...
- android studio四大组件,Android 四大组件 Service 完全理解
瞎忙到头晕... Service主要使用在后台比较耗时和运行时间较长的逻辑.但是在service中使用 Thread.currentThread().getId() 获取得到的却是1,也就是主线程.如 ...
- Android onFinishInflate理解
2019独角兽企业重金招聘Python工程师标准>>> 在View中,有个onFinishInflate方法,当应用从XML加载该组件并用它构建界面之后调用的方法.所以有的同学习惯在 ...
- android小球移动代码,Android自定义圆形View实现小球跟随手指移动效果
本文实例为大家分享了Android实现小球跟随手指移动效果的具体代码,供大家参考,具体内容如下 一. 需求功能 手指在屏幕上滑动,红色的小球始终跟随手指移动. 实现的思路: 1)自定义View,在on ...
- android 模板 ui布局,Android UI布局
一.线性布局-LinearLayout(至上而下布局) 其中 android:orientation="vertical"意思为垂直 方向的线性布局,此处的"vertic ...
- 我的Android进阶之旅------Android项目目录结构分析
此文章来自"博客园"博主,仅在此借鉴,学习 1.HelloWorld项目的目录结构 1.1.src文件夹 1.2.gen文件夹 1.3.Android 2.1文件夹 1.4.ass ...
最新文章
- (送)Java 架构技术揭秘:Redis+Nginx+Dubbo精选+面试题+精选视频
- D.Digits 思维dp 取log乘积变成加法
- RxJava操作符在android中的使用场景详解(一)
- word图片自动换行不亮_Word自动换行版式不变形
- html设置box设置长度自适应,CSS实现宽度自适应宽高16:9的矩形的示例
- C#和Java的代码转换工具(开源)CSharpJavaMerger Framework
- PHP——smarty模板(第一天)
- udp协议的服务器是哪种类型,UDP协议
- r语言怎么保存代码_R代码忘记保存,系统崩溃了怎么办?
- java 支付宝wap支付初识
- android switch自定义样式,Android自定义Switch样式
- 从二分逼近领略计算科学的魅力
- [整理]flex,datagrid数值列排序
- 论文阅读:Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector
- HDU---2037
- 情商高的人比智商高的可怕多了
- 利用小工具解除pdf的编辑保护
- SIBT SSHT 2023展位火爆抢定中 共燃建筑空间智慧浪潮
- 6.5 自定义报表方案
- Kafka可视化管理工具kafka-manager部署安装和使用-已更名为CMAK
热门文章
- Elasticsearch 7.10 之 Slow Log
- 2022-2027年中国聚甲醛(POM)市场生产现状与投资前景预测报告
- Ten Simple Rules for Effective Statistical Practice
- 【深度学习 学习率,优化器】——深刻解读训练网络时各种学习率,优化器的区别,learning rate, Momentum
- Apache+Python+Windows进行CGI编程新手上路时的各种坑
- 【C++从0到1】7.C++中标识符的命名
- 老李8.19盘后小结
- 来自鹅厂的面试经验(干货)
- 2022家电行业舆情监控及应对分析
- 跳槽就能薪水翻倍?这样的日子一去不复返:互联网人才“高薪”泡沫刺破