进程线程
Android 一起来看看 ThreadLocal
ThreadLocal 是一个线程内部的数据存储类,通过它可以在 指定的线程中 存储数据,数据存储以后,只有在指定线程中可以获取到存储的数据,对于其他线程来说则无法获取到数据。 一般来说,当某些数据是以线程为作用域并且不同线程具有不同的数据副本的时候,就可以考虑采用 Threa…
android AsyncTask 的分析与运用
线程 在 Android 当中,通常将线程分为两种,一种叫做 Main Thread,除了 Main Thread 之外的线程都可称为 Worker Thread。 当一个应用程序运行的时候,Android 操作系统就会给该应用程序启动一个线程,这个线程就是我们的 Main Thread,这个…
Shadowsocks Android 源码解读之 Java 多进程编程
阅读 Shadowsocks Android 源码时,遇到了 GuardedProcess 类,该类是用来创建 native 层的 ss-local, tun2socks, pdnsd, ss-tunnel 进程。要运行这些进程,就牵扯到了 Java 的多进程编程,以下是关于 …
Android AIDL 知识点
示例代码已上传Github,https://github.com/tb-yangshu/AndroidExamples
你真的了解 volatile 关键字吗?
volatile 关键字经常在并发编程中使用,其特性是保证可见性以及有序性,但是关于 volatile 的使用仍然要小心,这需要明白 volatile 关键字的特性及实现的原理,这也是本篇文章的主要内容。
Android 之 Handler 用法总结
很多初入 Android 或 Java 开发的新手对 Thread、Looper、Handler 和 Message 仍然比较迷惑,衍生的有 HandlerThread、java.util.concurrent、Task、AsyncTask 由于目前市面上的书籍等资料都没有谈到这些问题,今天就这一问题做更系统性的总结。我们创建的 Service、Activity 以及 Broadcast 均是一个主线程处理,这里我们可以理解为 UI 线程。但是在操作一些
【漫画技术】Android跨进程通信
Tips:4个环节,共计约9小时的精心打磨完成上线,同时也非常感谢参与审稿的同学。 看完该漫画后,是不是觉得小猪仔的一生有点小悲凉,要怪就怪可恶的人类,无肉不欢,哈哈。 精彩的漫画背后,总隐藏着一丝丝技术的小知识。本文将为你介绍“Android跨进程通信”的相关知识,通过本文的…
Android 进程间通信
要讲 Android 进程通信的话,就不得不先讲讲 Service. Service 是 Android 的四大组件之一,它主要的作用是后台执行操作,Activity 属于带有 UI 界面跟用户进行交互,而 Service 则没有 UI 界面,所有的操作都是基于后台运行完成。并…
再一次去认识 Android 线程及线程池
Android 线程及线程池
Android 中进程间通信(IPC)方式总结
这篇文章主要是围绕着 Android 中的进程间通信(IPC)知识点,做一阐述与总结,自己能力有限,请多多提提意见,谢谢。
Android进程保活-自“裁”或者耍流氓
本篇文章是后台杀死系列的最后一篇,主要探讨一下进程的保活,Android本身设计的时候是非常善良的,它希望进程在不可见或者其他一些场景下APP要懂得主动释放,可是Android低估了”贪婪“,尤其是很多国产APP,只希望索取来提高自己的性能,不管其他APP或者系统的死活,导致了…
handler 机制源码分析
handler 机制源码分析
关于线程,还有这些是你需要知道的!
本篇,CoorChice 将从多线程的角度来进一步介绍线程的相关知识。
Android 进程间通信 AIDL详解
最近项目有进程间通信的需求,我使用的是IPC通信的方式,这是Android中很传统的一种进程间通信的方式,在这里分享给大家。 进程间通信意义 我们为什么要使用进程间通信。我说一个场景,比如我们有两个App,其中一个App(名字为A),有授权登陆,我们还有一个App(名字为B)可…
Java多线程-带你认识Java内存模型,内存分区,从原理剖析Volatile关键字
Java的内存模型。 Java的内存分区。 全局变量、局部变量、对象、实例再内存中的位置。 JVM重排序机制。 JVM的原子性、可见性、有序性。 彻底了解Volatile关键字。 一. Java的内存模型 Java内存模型即Java Memory Model,简称JMM。JMM…
Java ThreadLocal 类的知识点解读
说起 Java 中的 ThreadLocal 类,可能很多安卓开发人员并不是很熟悉,毕竟很少有使用到的地方。但是如果你仔细分析过 Handler 源码的话,就一定见过这个类的出现。而 Handler 机制又是安卓知识体系中非常重要的一环,所以我们有必要了解一下 ThreadLo…
简单理解 Binder 机制的原理
Android 系统中,涉及到多进程间的通信底层都是依赖于 Binder IPC 机制。例如当进程 A 中的 Activity 要向进程 B 中的 Service 通信,这便需要依赖于 Binder IPC。不仅于此,整个 Android 系统架构中,大量采用了 Binder 机制作为 IPC(进程间通信)方案。
Java 之 volatile 详解
一、概念 volatile 是 Java 中的关键字,是一个变量修饰符,被用来修饰会被不同线程访问和修改的变量。 二、volatile 作用 1. 可见性 可见性是指多个线程访问同一个变量时,其中一个线程修改了该变量的值,其它线程能够立即看到修改的值。 在 Java 内存模型中,…
Android-- 异步消息处理机制(Handler、Looper、Message、MessageQueue)
这篇文章主要是总结 Handler、Looper、Message、MessageQueue 的知识点,自己总结出来,做一分享,希望大家多多支持!
从ADIL跨进程绑定通讯再探Service知识
我们就可以通过AIDL来辅助进行绑定,从而实现Activity跨进程操作Service
volatile 关键字解析(非常棒的文章)
volatile 这个关键字可能很多朋友都听说过,或许也都用过。在 Java 5 之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在 Java 5 之后,volatile 关键字才得以重获生机。
Android 进程间通信之 AIDL 详解
本文将从以下 6 个方面去介绍我所理解的 AIDL
1、WHY(目的)
2、Support(支持的数据类型)
3、How(如何使用)
4、What's The Meaning(AIDL 生成的 java 文件各部分的含义)
5、Permission(客户端调用时的权限验证)
6、Best Practice(使用连接池管理)
Android探索之旅 | 用AsyncTask实现多线程+实例
-- 作者 谢恩铭 转载请注明出处 用AsyncTask实现多线程 在Android应用开发中,有时我们需要实现任务的同步。 Android里的AsyncTask类可以帮我们更好地管理线程同步(异步方式),就像Thread类能做的,不过用法比Thread更简单。 AsyncTa…
Android 进程保活招式大全
目前市面上的应用,貌似除了微信和手 Q 都会比较担心被用户或者系统(厂商)杀死问题。本文对 Android 进程拉活进行一个总结。
android 跨进程点击方式总结
我们在日常的测试中,经常需要模拟用户点击等操作来实现模拟用户各种输入功能,在这里归纳总结一下几种点击方式,以及它们各自的优缺点,目前实现跨进程点击方式大致会有一下四种方式 一 adb shell 命令下输入 input命令,我们会看它支持的事件类型如下图: 我们重点来看一下in…
Java ThreadPoolExecutor 线程池调度器
所有 BlockingQueue 都可用于传输和保持提交的任务。可以使用此队列与池大小进行交互:
如果运行的线程少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。(什么意思?如果当前运行的线程小于 corePoolSize,则任务根本不会存放,添加到 queue 中,而是直接开始运行 thread。
如果运行的线程等于或多于 corePoolSize,则 Executor 始终首选将请求加入队列,而不添加新的线程。
如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。
Q:你了解异步编程、进程、单线程、多线程吗?
同步:一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去。 异步:进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。 进程:狭…
巧用 Android 多进程,微信,微博等主流 App 都在用
微信移动开发团队在 《Android 内存优化杂谈》 一文中就说到:“对于 webview,图库等,由于存在内存系统泄露或者占用内存过多的问题,我们可以采用单独的进程。微信当前也会把它们放在单独的 tools 进程中”。
Java 中的多线程你只要看这一篇就够了
java 多线程
Android 基础回顾 (3)——ThreadLocal 原理
ThreadLocal 原理
Android 中多线程的使用四种方式最全总结
多线程一直都是技术开发中的难点和重点,本文全面的总结了 Android 开发中实现多线程的四种方式。
面试时问到进程间通信, 你该如何回答?
进程间通信 (Inter-Process Communication), 简称 IPC, 就是指进程与进程之间进行通信. 一般来说, 一个 app 只有一个进程, 但是可能会有多个线程, 所以我们用得比较多的是多线程通信, 比如 handler,AsyncTask.
但是在一些特殊的情况下, 我们 app 会需要多个进程, 或者是我们在远程服务调用时, 就需要跨进程通信了
活儿好又不纠缠的 IntentService
版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。 未经允许,不得转载。 一、前言 Service 是 Android 四大组件之一,正常来说,我们直接使用 Service 就可以了。 但是 Service 存在几个问题: 默认不会运行在单…
Android 多线程的各种实现方式解析
线程在 Android 中是一个比较重要的概念,由于 Android 的特性,如果在主线程中执行耗时操作就会导致程序无法及时的响应,因此耗时操作必须放在子线程中去执行。
下面开始介绍 Android 多线程中一些比较重要的实现方式。
【腾讯 Bugly 干货分享】Android 进程保活招式大全
目前市面上的应用,貌似除了微信和手 Q 都会比较担心被用户或者系统(厂商)杀死问题。本文对 Android 进程拉活进行一个总结。
线程池执行原则及参数详解
本文介绍关于线程池的执行原则以及构造方法的参数详解。
线程池的好处
引用自 http://ifeve.com/java-threadpool/ 的说明:
- 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
- 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
创建线程池
// 参数初始化
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
// 核心线程数量大小
private static final int corePoolSize = Math.max(2, Math.min(CPU_COUNT - 1, 4));
// 线程池最大容纳线程数
private static final int maximumPoolSize = CPU_COUNT * 2 + 1;
// 线程空闲后的存活时长
private static final int keepAliveTime = 30;
// 任务过多后,存储任务的一个阻塞队列
BlockingQueue<Runnable> workQueue = new SynchronousQueue<>();
// 创建线程的工厂
ThreadFactory threadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
return new Thread(r, "AdvacnedAsyncTask #" + mCount.getAndIncrement());
}
};
// 线程池任务满载后采取的任务拒绝策略
RejectedExecutionHandler rejectHandler = new ThreadPoolExecutor.DiscardOldestPolicy();
// 线程池对象,创建线程
ThreadPoolExecutor mExecute = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
TimeUnit.SECONDS,
workQueue,
threadFactory,
rejectHandler
);
具体参数介绍
- corePoolSize
线程池的核心线程数。在没有设置 allowCoreThreadTimeOut 为 true 的情况下,核心线程会在线程池中一直存活,即使处于闲置状态。
- maximumPoolSize
线程池所能容纳的最大线程数。当活动线程 (核心线程 + 非核心线程) 达到这个数值后,后续任务将会根据 RejectedExecutionHandler 来进行拒绝策略处理。
- keepAliveTime
非核心线程
闲置时的超时时长。超过该时长,非核心线程就会被回收。若线程池通过allowCoreThreadTimeOut()
方法设置 allowCoreThreadTimeOut 属性为 true,则该时长同样会作用于核心线程,AsyncTask 配置的线程池就是这样设置的。
- unit
keepAliveTime 时长对应的单位。
- workQueue
线程池中的任务队列,通过线程池的 execute() 方法提交的 Runnable 对象会存储在该队列中。
- ThreadFactory
线程工厂,功能很简单,就是为线程池提供创建新线程的功能。这是一个接口,可以通过自定义,做一些自定义线程名的操作。
- RejectedExecutionHandler
当任务无法被执行时 (超过线程最大容量 maximum 并且 workQueue 已经被排满了) 的处理策略,这里有四种任务拒绝类型。
线程池工作原则
- 1、当线程池中线程数量小于 corePoolSize 则创建线程,并处理请求。
- 2、当线程池中线程数量大于等于 corePoolSize 时,则把请求放入 workQueue 中, 随着线程池中的核心线程们不断执行任务,只要线程池中有空闲的核心线程,线程池就从 workQueue 中取任务并处理。
- 3 、当 taskQueue 已存满,放不下新任务时则新建非核心线程入池,并处理请求直到线程数目达到 maximumPoolSize(最大线程数量设置值)。
- 4、如果线程池中线程数大于 maximumPoolSize 则使用 RejectedExecutionHandler 来进行任务拒绝处理。
任务队列 BlockingQueue
任务队列 workQueue 是用于存放不能被及时处理掉的任务的一个队列,它是
一个 BlockingQueue 类型。
关于 BlockingQueue,虽然它是 Queue 的子接口,但是它的主要作用并不是容器,而是作为线程同步的工具,他有一个特征,当生产者试图向 BlockingQueue 放入 (put) 元素,如果队列已满,则该线程被阻塞;当消费者试图从 BlockingQueue 取出 (take) 元素,如果队列已空,则该线程被阻塞。(From 疯狂 Java 讲义)
任务拒绝类型
- ThreadPoolExecutor.AbortPolicy:
当线程池中的数量等于最大线程数时抛 java.util.concurrent.RejectedExecutionException 异常,涉及到该异常的任务也不会被执行,线程池默认的拒绝策略就是该策略。
- ThreadPoolExecutor.DiscardPolicy():
当线程池中的数量等于最大线程数时, 默默丢弃不能执行的新加任务,不报任何异常。
- ThreadPoolExecutor.CallerRunsPolicy():
当线程池中的数量等于最大线程数时,重试添加当前的任务;它会自动重复调用 execute()方法。
- ThreadPoolExecutor.DiscardOldestPolicy():
当线程池中的数量等于最大线程数时, 抛弃线程池中工作队列头部的任务(即等待时间最久的任务),并执行新传入的任务。
参考
- 聊聊并发(三)Java 线程池的分析和使用
- Android 线程池(二)——ThreadPoolExecutor 及其拒绝策略 RejectedExecutionHandler 使用示例
-
多线程 线程池 ThreadPoolExecutor 介绍
安卓开发:使用双进程守护和进程提权来实现服务进程保活
在网上总结了一些进程保活方法,本文以双进程守护和进程提权来保活我们的服务进程。
android IPC 机制及进程通信
android 中得多进程及进程通信介绍
从 Java 到 C++, 以 JVM 的角度看 Java 线程的创建与运行
从 Java 一直到 C++,在 JVM 层面上探索 Java 线程的创建与运行
关于线程,还有这些是你需要知道的!
有什么料?
- 进一步理解多线程场景下会出现的问题;
- 学会正确处理并发操作中的通讯和同步。
Android 进阶:对比总结安卓的几种进程通信方式
进阶、面试必看