Android官方开发文档Training系列课程中文版:线程执行操作之线程池操作

原文地址:http://android.xsoftlab.net/training/multiple-threads/run-code.html#StopThread

上节课我们学习了如何定义一个类用于管理线程以及任务。这节课将会学习如何在线程池中运行任务。要做到这一点,只需要往线程池的工作队列中添加任务即可。当一条线程处于闲置状态时,那么ThreadPoolExecutor会从任务队列中取出一条任务并放入该线程中运行。

这节课还介绍了如何停止一个正在运行中的任务。如果在任务开始后,可能发现这项任务并不是必须的,那么就需要用到任务取消的功能了。这样可以避免浪费处理器的时间。举个例子,如果你正从网络上下载一张图像,如果侦测到这张图像已经在缓存中了,那么这时就需要停止这项网络任务了。

在线程池中的线程内运行任务

为了在指定的线程池中启动一项线程任务,需要将Runnable对象传给ThreadPoolExecutor的execute()方法。这个方法会将任务添加到线程池的工作队列中去。当其中一个线程变为闲置状态时,那么线程池管理器会从队列中取出一个已经等待了很久的任务,然后放到这个线程中运行:

public class PhotoManager {public void handleState(PhotoTask photoTask, int state) {switch (state) {// The task finished downloading the imagecase DOWNLOAD_COMPLETE:// Decodes the imagemDecodeThreadPool.execute(photoTask.getPhotoDecodeRunnable());...}...}...
}

当ThreadPoolExecutor启动一个Runnable时,它会自动调用Runnable的run()方法。

中断执行中的代码

如果要停止一项任务,那么需要中断该任务所在的线程。为了可以预先做到这一点,那么需要在任务创建时存储该任务所在线程的句柄:

class PhotoDecodeRunnable implements Runnable {// Defines the code to run for this taskpublic void run() {/** Stores the current Thread in the* object that contains PhotoDecodeRunnable*/mPhotoTask.setImageDecodeThread(Thread.currentThread());...}...
}

我们可以调用Thread.interrupt()方法来中断一个线程。这里要注意Thread对象是由系统控制的,系统会在应用进程的范围之外修改它们。正因为这个原因,在中断线程之前,需要对线程的访问加锁。通常需要将这部分代码放入同步代码块中:

public class PhotoManager {public static void cancelAll() {/** Creates an array of Runnables that's the same size as the* thread pool work queue*/Runnable[] runnableArray = new Runnable[mDecodeWorkQueue.size()];// Populates the array with the Runnables in the queuemDecodeWorkQueue.toArray(runnableArray);// Stores the array length in order to iterate over the arrayint len = runnableArray.length;/** Iterates over the array of Runnables and interrupts each one's Thread.*/synchronized (sInstance) {// Iterates over the array of tasksfor (int runnableIndex = 0; runnableIndex < len; runnableIndex++) {// Gets the current threadThread thread = runnableArray[taskArrayIndex].mThread;// if the Thread exists, post an interrupt to itif (null != thread) {thread.interrupt();}}}}...
}

在多数情况下,Thread.interrupt()会使线程立刻停止。然而,它只会将那些正在等待的线程停下来,它并不会中止CPU或网络任务。为了避免使系统变慢或卡顿,你应当在开始任意一项操作之前测试是否有中断请求:

/** Before continuing, checks to see that the Thread hasn't* been interrupted*/
if (Thread.interrupted()) {return;
}
...
// Decodes a byte array into a Bitmap (CPU-intensive)
BitmapFactory.decodeByteArray(imageBuffer, 0, imageBuffer.length, bitmapOptions);
...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/478801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谁才是Transformer家族中的最强王者?谷歌告诉你答案

文 | Sherry自从17年Attention is all you need发出&#xff0c;继而18年BERT刷新各大榜单&#xff0c;大型预训练Transformer似乎已经成为自然语言处理的标准基准模型&#xff0c;甚至进一步渗透到图像领域。各路大神基于Transformer提出了海量改进方法。这些改变是否对大多数…

LeetCode 652. 寻找重复的子树(DFS)

1. 题目 给定一棵二叉树&#xff0c;返回所有重复的子树。对于同一类的重复子树&#xff0c;你只需要返回其中任意一棵的根结点即可。 两棵树重复是指它们具有相同的结构以及相同的结点值。 示例 1&#xff1a;1/ \2 3/ / \4 2 4/4 下面是两个重复的子树&#xff1a…

论文浅尝 - CIKM2020 | Relation Reflection Entity Alignment

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士生。来源&#xff1a;CIKM 2020链接&#xff1a;https://arxiv.org/pdf/2008.07962.pdf研究背景与任务描述:实体对齐旨在基于已有对齐实体标注的情况下&#xff0c;确定不同KG中未知的对等实体&#xff0c;其本质是mult…

Android官方开发文档Training系列课程中文版:线程执行操作之线程间通讯

原文地址&#xff1a;http://android.xsoftlab.net/training/multiple-threads/communicate-ui.html 上节课我们学习了如何启动一项由ThreadPoolExecutor所管理的线程任务。最后这节课我们将学习如何从任务中发送结果数据给UI线程。这项手段可以使任务在执行完毕后将结果显示到…

SQL解析在美团的应用

数据库作为核心的基础组件&#xff0c;是需要重点保护的对象。任何一个线上的不慎操作&#xff0c;都有可能给数据库带来严重的故障&#xff0c;从而给业务造成巨大的损失。为了避免这种损失&#xff0c;一般会在管理上下功夫。比如为研发人员制定数据库开发规范&#xff1b;新…

无内鬼,来点ICML/ACL审稿人笑话

文 | Sheryc_王苏最近&#xff0c;如果你的小伙伴突然没时间陪你出来玩了&#xff0c;请不要担心&#xff0c;ta可能正在与ICML/IJCAI/ACL的审稿人斗智斗勇。过去的一周里&#xff0c;机器学习顶会ICML、人工智能顶会IJCAI和NLP顶会ACL扎堆放出审稿人意见&#xff0c;有人欢喜有…

Docx:docx.opc.exceptions.PackageNotFoundError: Package not found at

Docx:docx.opc.exceptions.PackageNotFoundError: Package not found at&#xff1a;https://blog.csdn.net/python__reported/article/details/106318330 Docx:docx.opc.exceptions.PackageNotFoundError: Package not found at 一、报错内容二、解决方法 一、报错内容 报错&a…

LeetCode 148. 排序链表(归并排序、快速排序)

文章目录1. 题目2. 解题2.1 归并排序2.2 快速排序1. 题目 在 O(n log n) 时间复杂度和常数级空间复杂度下&#xff0c;对链表进行排序。 示例 1:输入: 4->2->1->3 输出: 1->2->3->4 示例 2:输入: -1->5->3->4->0 输出: -1->0->3->4-&…

论文浅尝 | 基于对抗学习的弱监督知识图谱对齐

论文笔记整理&#xff1a;郭凌冰&#xff0c;浙江大学研究助理&#xff0c;研究方向为知识图谱的表示学习。绝大部分现有的知识图谱对齐方法都要求足够的已对齐三元组作为监督数据&#xff0c;但在现实世界中&#xff0c;获取大量的对齐三元组的代价十分高昂。本文提出一种同时…

美团数据平台Kerberos优化实战

背景 Kerberos 是一种网络认证协议&#xff0c;其设计目标是通过密钥系统为客户端、服务器端的应用程序提供强大的认证服务。 作为一种可信任的第三方认证服务&#xff0c;Kerberos是通过传统的密码技术&#xff08;如&#xff1a;共享密钥&#xff09;执行认证服务的&#xff…

Android官方开发文档Training系列课程中文版:如何避免ANR?

原文地址&#xff1a;http://android.xsoftlab.net/training/articles/perf-anr.html#anr 尽管你写代码可能通过了世界上所有的性能测试&#xff0c;但是它还是可能会让人感觉到卡顿。当应用卡的不成样子时&#xff0c;系统会给你弹一个”Application Not Responding”的对话框…

预训练语言模型真的是世界模型?

文 | 子龙自GPT、BERT问世以来&#xff0c;预训练语言模型在NLP领域大放异彩&#xff0c;刷新了无数榜单&#xff0c;成为当前学界业界的心头爱&#xff0c;其主体结构——Transformer——也在逐步的运用于其他领域的任务中&#xff0c;常见的如与CV的跨界&#xff0c;也有相对…

monk js_对象检测-使用Monk AI进行文档布局分析

原文链接&#xff1a;https://blog.csdn.net/weixin_26752075/article/details/108494230 monk js 计算机视觉 (Computer Vision) 介绍 (Introduction) This is an article on how Object Detection can help us in predicting various regions of a document. It can be usefu…

LeetCode 2019 力扣杯全国秋季编程大赛

文章目录1. 比赛结果2. 题目解析2.1 猜数字 Easy2.2 分式化简 Esay2.3 机器人大冒险 Medium2.4 覆盖 Hard2.5 发 LeetCoin Hard1. 比赛结果 2019.9.24晚&#xff0c;第一次参加线上比赛 比赛排名结果&#xff1a;582/1541&#xff0c;做出了2道题。。。 我证明了&#xff1a;…

美团广告实时索引的设计与实现

背景 在线广告是互联网行业常见的商业变现方式。从工程角度看&#xff0c;广告索引的结构和实现方式直接决定了整个系统的服务性能。本文以美团的搜索广告系统为蓝本&#xff0c;与读者一起探讨广告系统的工程奥秘。 领域问题 广告索引需具备以下基本特性&#xff1a; 层次化的…

论文浅尝 - AAAI2020 | 多通道反向词典模型

论文笔记整理&#xff1a;朱珈徵&#xff0c;天津大学硕士&#xff0c;自然语言处理方向。链接&#xff1a;https://arxiv.org/pdf/1912.08441.pdf动机反向词典将一段描述作为输入&#xff0c;并一起输出与该描述匹配的其他词&#xff0c;具有重要实用价值和自然语言处理研究价…

Android官方开发文档Training系列课程中文版:Android的JNI相关

原文地址&#xff1a;http://android.xsoftlab.net/training/articles/perf-jni.html JNI的全称为Java Native Interface&#xff0c;中文意思是Java本地接口。它定义了Java代码与C/C代码之间的交互方式。它是两者的桥梁&#xff0c;支持从动态共享库中加载代码。虽然有些复杂…

拒绝暴力调参!推荐一个模型Debug神器!

近些年深度学习在视觉、自然语言处理、语音等各个技术方向都诞生了不少创新应用&#xff0c;如智能识别医疗图像中的病灶&#xff0c;辅助医生做病情诊断&#xff1b;智能判别生产线上有质量问题的产品&#xff0c;减轻人工质检压力&#xff1b;对政务、金融等流程中的证件票据…

TIFF图像被转换为​​JPEG格式的图像

TIFF图像被转换为​​JPEG格式的图像。 for name in glob.glob(root_dirimg_dir*.tif): im Image.open(name) name str(name).rstrip(".tif") name str(name).lstrip(root_dir) name str(name).lstrip(img_dir) im.save(final_root_di…

Android官方开发文档Training系列课程中文版:Android的安全建议

原文地址&#xff1a;http://android.xsoftlab.net/training/articles/security-tips.html Android系统内置的安全策略可以有效的降低应用程序的安全问题。所以默认创建的应用程序已经包含了一定程度的安全保护措施。 Android所包含的安全策略有&#xff1a; 应用程序沙箱&a…