说完原理,再来看看线程的创建和复用的相关代码(基于 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相关推荐

  1. Android深入理解Fragment

    Fragment 目录 思维导图 概述 设计原因 基本使用 xml 声明 代码设置 添加没有 UI 的 fragment 生命周期 管理 Fragment 和执行事务 与 Activity 通信 常见 ...

  2. android scaletype没作用,Android源码系列之深入理解ImageView的ScaleType属性

    做Android开发的童靴们肯定对系统自带的控件使用的都非常熟悉,比如Button.TextView.ImageView等.如果你问我具体使用,我会给说:拿ImageView来说吧,首先创建一个新的项 ...

  3. android:layout_with=,android – 难以理解layout_alignWithParentIfMissing

    这仅适用于使用RelativeLayout时. 如果您将元素设置为一个其他元素,则表示该元素位于该元素的左侧. 但是如果这个元素会丢失,因为你删除它,例如它将与父对齐. 举个例子 android:la ...

  4. android自动夜间模式,Android实现日夜间模式的深入理解

    在本篇文章中给出了三种实现日间/夜间模式切换的方案,三种方案综合起来可能导致文章的篇幅过长,请耐心阅读. 1.使用 setTheme的方法让 Activity重新设置主题: 2.设置 Android ...

  5. Android 深入理解Android中的自定义属性

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45022631: 本文出自:[张鸿洋的博客] 1.引言 对于自定义属性,大家肯定 ...

  6. android studio四大组件,Android 四大组件 Service 完全理解

    瞎忙到头晕... Service主要使用在后台比较耗时和运行时间较长的逻辑.但是在service中使用 Thread.currentThread().getId() 获取得到的却是1,也就是主线程.如 ...

  7. Android onFinishInflate理解

    2019独角兽企业重金招聘Python工程师标准>>> 在View中,有个onFinishInflate方法,当应用从XML加载该组件并用它构建界面之后调用的方法.所以有的同学习惯在 ...

  8. android小球移动代码,Android自定义圆形View实现小球跟随手指移动效果

    本文实例为大家分享了Android实现小球跟随手指移动效果的具体代码,供大家参考,具体内容如下 一. 需求功能 手指在屏幕上滑动,红色的小球始终跟随手指移动. 实现的思路: 1)自定义View,在on ...

  9. android 模板 ui布局,Android UI布局

    一.线性布局-LinearLayout(至上而下布局) 其中 android:orientation="vertical"意思为垂直 方向的线性布局,此处的"vertic ...

  10. 我的Android进阶之旅------Android项目目录结构分析

    此文章来自"博客园"博主,仅在此借鉴,学习 1.HelloWorld项目的目录结构 1.1.src文件夹 1.2.gen文件夹 1.3.Android 2.1文件夹 1.4.ass ...

最新文章

  1. (送)Java 架构技术揭秘:Redis+Nginx+Dubbo精选+面试题+精选视频
  2. D.Digits 思维dp 取log乘积变成加法
  3. RxJava操作符在android中的使用场景详解(一)
  4. word图片自动换行不亮_Word自动换行版式不变形
  5. html设置box设置长度自适应,CSS实现宽度自适应宽高16:9的矩形的示例
  6. C#和Java的代码转换工具(开源)CSharpJavaMerger Framework
  7. PHP——smarty模板(第一天)
  8. udp协议的服务器是哪种类型,UDP协议
  9. r语言怎么保存代码_R代码忘记保存,系统崩溃了怎么办?
  10. java 支付宝wap支付初识
  11. android switch自定义样式,Android自定义Switch样式
  12. 从二分逼近领略计算科学的魅力
  13. [整理]flex,datagrid数值列排序
  14. 论文阅读:Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector
  15. HDU---2037
  16. 情商高的人比智商高的可怕多了
  17. 利用小工具解除pdf的编辑保护
  18. SIBT SSHT 2023展位火爆抢定中 共燃建筑空间智慧浪潮
  19. 6.5 自定义报表方案
  20. Kafka可视化管理工具kafka-manager部署安装和使用-已更名为CMAK

热门文章

  1. Elasticsearch 7.10 之 Slow Log
  2. 2022-2027年中国聚甲醛(POM)市场生产现状与投资前景预测报告
  3. Ten Simple Rules for Effective Statistical Practice
  4. 【深度学习 学习率,优化器】——深刻解读训练网络时各种学习率,优化器的区别,learning rate, Momentum
  5. Apache+Python+Windows进行CGI编程新手上路时的各种坑
  6. 【C++从0到1】7.C++中标识符的命名
  7. 老李8.19盘后小结
  8. 来自鹅厂的面试经验(干货)
  9. 2022家电行业舆情监控及应对分析
  10. 跳槽就能薪水翻倍?这样的日子一去不复返:互联网人才“高薪”泡沫刺破