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