![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
Luckie stone
Android应用开发。
展开
-
在Android中使用并发来提高速度和性能
Android框架提供了很实用的异步处理类。然而它们中的大多数在一个单一的后台线程中排队。当你需要多个线程时你是怎么做的?众所周知,UI更新发生在UI线程(也称为主线程)。在主线程中的任何操作都会阻塞UI更新,因此当需要大量计算时可以使用AsyncTask, IntentService 和 Threads。事实上,在不久前我写了在android中异步处理的8种方式。然而,Android中的As...转载 2018-05-10 16:33:11 · 801 阅读 · 0 评论 -
Android单线程模型说明
2 Android进程 在了解Android线程之间得先了解一下Android的进程。当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。同时,Android会为每个应用程序分配一个单独的LINUX用户。Android会劲量保留一个正在运行进程,只在内存资源出现不足时,Android会参试停止一些进程从而释放足够...转载 2018-07-14 06:55:44 · 651 阅读 · 0 评论 -
android 单线程模型
当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。在开发Android 应用时必须遵守单线程模型的原则:1. 不要阻塞UI线程2. 确保只在UI线程中访问Android UI工具包...转载 2018-07-09 06:17:21 · 886 阅读 · 0 评论 -
HandlerThread的使用以及原理
首先我们先看一下官方的描述:Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called.HandlerThread能够新建拥有Looper的线程。...转载 2018-07-01 11:44:17 · 125 阅读 · 0 评论 -
异步任务AsyncTask使用解析
AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用。AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法。注意继承时需要设定三个泛型Params,Progress和Result的类型,如AsyncTask<Void,Inetger,Void>:Params是指调用execute()方法时传入的参数类型和doInBa...转载 2018-07-01 11:37:24 · 136 阅读 · 0 评论 -
Android HandlerThread 完全解析
转载出处: http://blog.csdn.net/lmj623565791/article/details/47079737; 本文出自:【张鸿洋的博客】 1、概述话说最近股市变动不变,也成了热火朝天的话题。不知道大家有没有考虑做个实时更新股市数据的app呢?假设我们要做一个股市数据实时更新的app,我们可以在网上找个第三方的股市数据接口,然后在我们的app中每隔1...转载 2018-03-08 09:21:55 · 130 阅读 · 0 评论 -
Android 子线程中操作UI
开发Android的都知道,自2.2之后,谷歌工程师规定了子线程不允许更新UI,原因说起来也简单,可以想一想,如果多个子线程同时操作UI,那么该听谁的呢,所以,现在在子线程中写关于操作UI的代码,运行就回报异常。我们都知道耗时的操作,例如数据库读写大量数据,网络请求,这些都比较耗时间,一般情况下都会放入子线程里面操作,这样不会阻塞UI。但是每次当我们操作完这些数据之后,就要更新UI的数据,但是...转载 2018-03-06 20:21:40 · 454 阅读 · 0 评论 -
ThreadPoolExecutor 异常
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, ...原创 2018-05-15 10:03:37 · 538 阅读 · 0 评论 -
详解 ThreadLocal
ThreadLocal 主要用来提供线程局部变量,也就是变量只对当前线程可见。 线程局部变量在多线程环境下,之所以会有并发问题,就是因为不同的线程会同时访问同一个共享变量,例如下面的形式public class MultiThreadDemo { public static class Number { private int value = 0; ...转载 2018-04-25 17:07:23 · 147 阅读 · 0 评论 -
Android 进程和线程模型
Android进程模型在安装Android应用程序的时候,Android会为每个程序分配一个Linux用户ID,并设置相应的权限,这样其它应用程序就不能访问此应用程序所拥有的数据和资源了。在 Linux 中,一个用户ID 识别一个给定用户;在 Android 上,一个用户ID 识别一个应用程序。应用程序在安装时被分配用户 ID,应用程序在设备上的存续期间内,用户ID 保持不变。默认情况...转载 2018-07-14 06:55:51 · 230 阅读 · 0 评论 -
怎样在异步任务执行完成后就可以获取执行结果
我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,那如果我们想要获取返回结果该如何实现呢?从JAVA SE 5.0开始引入了Callable和Future,通过它们构建的线程,在任务执行完成后就可以获取执行结果。我们先回顾一下java.lang.Runnable接口,就声明了run()...原创 2018-03-30 08:17:17 · 6994 阅读 · 0 评论 -
如何确保三个线程顺序执行?
场景:有三个线程t1、t2、t3。确保三个线程t1执行完后t2执行,t2执行完成后t3执行。1.使用join thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。t.join(); //调用join方法,等待线程t执行完毕t.join(...转载 2018-07-18 06:34:51 · 4011 阅读 · 0 评论 -
延迟队列DelayQueue研究
1.什么是DelayQueue DelayQueue 是 Delayed 元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部 是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且 poll 将返回 null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于等于 0 的值时,将发生到期...转载 2018-07-18 06:34:45 · 1189 阅读 · 0 评论 -
java线程的阻塞
线程的阻塞 为了解决对共享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对共享资源的访问,显然同步机制已经不够了,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了的资源也可能不止一个。为了解决这种情况下的访问控制问题,Java 引入了对阻塞机制的支持。 阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),学过操作系统...转载 2018-07-16 06:17:52 · 2354 阅读 · 0 评论 -
Java多线程学习
本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。在这之前,首先让我们来了解下在操作系统中进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计...转载 2018-07-16 06:18:00 · 179 阅读 · 0 评论 -
Java内存模型(JMM)及volatile关键字
理解Java内存区域与Java内存模型Java内存区域Java虚拟机在运行程序时会把其自动管理的内存划分为以上几个区域,每个区域都有的用途以及创建销毁的时机,其中蓝色部分代表的是所有线程共享的数据区域,而绿色部分代表的是每个线程的私有数据区域。 方法区(Method Area): 方法区属于线程共享的内存区域,又称Non-Heap(非堆),主要用于存储已被虚拟机加载的类信息、...转载 2018-06-22 05:55:10 · 273 阅读 · 0 评论 -
Java中Synchronized的用法
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象; 2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象; 3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有...转载 2018-07-21 07:00:59 · 110 阅读 · 0 评论 -
编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程
什么是线程什么是线程?线程与进程与有什么关系?这是一个非常抽象的问题,也是一个特别广的话题,涉及到非常多的知识。我不能确保能把它讲的话,也不能确保讲的内容全部都正确。即使这样,我也希望尽可能地把他讲通俗一点,讲的明白一点,因为这是个一直困扰我很久的,扑朔迷离的知识领域,希望通过我的理解揭开它一层一层神秘的面纱。 任务调度线程是什么?要理解这个概念,须要先了解一下操作系统的一些相关概...转载 2018-07-21 07:01:53 · 96 阅读 · 0 评论 -
编程思想之多线程与多进程(2)——线程优先级与线程安全
线程优先级现在主流操作系统(如Windows、Linux、Mac OS X)的任务调度除了具有前面提到的时间片轮转的特点外,还有优先级调度(Priority Schedule)的特点。优先级调度决定了线程按照什么顺序轮流执行,在具有优先级调度的系统中,线程拥有各自的线程优先级(Thread Priority)。具有高优先级的线程会更早地执行,而低优先级的线程通常要等没有更高优先级的可执行线程时...转载 2018-07-21 07:02:04 · 132 阅读 · 0 评论 -
编程思想之多线程与多进程(3)——Java中的多线程
单线程任何程序至少有一个线程,即使你没有主动地创建线程,程序从一开始执行就有一个默认的线程,被称为主线程,只有一个线程的程序称为单线程程序。如下面这一简单的代码,没有显示地创建一个线程,程序从main开始执行,main本身就是一个线程(主线程),单个线程从头执行到尾。【Demo1】:单线程程序public static void main(String args[]) { Sy...转载 2018-07-22 07:20:11 · 592 阅读 · 0 评论 -
编程思想之多线程与多进程(4)——C++中的多线程
创建线程在Windows平台,Windows API提供了对多线程的支持。前面进程和线程的概念中我们提到,一个程序至少有一个线程,这个线程称为主线程(main thread),如果我们不显示地创建线程,那我们产的程序就是只有主线程的间线程程序。 下面,我们看看Windows中线程相关的操作和方法:CreateThread与CloseHandleCreateThread用于创建一个线程...转载 2018-07-22 07:20:18 · 726 阅读 · 0 评论 -
异步任务加载网络数据——AsyncTask使用
AsyncTask类简单介绍Android从1.5开始引入了AsyncTask这个类,AsyncTask内部使用Java 1.5的并发库比普通初级Android开发者编写的Thread+Handler稳定很多 AsyncTask封装了Thread和Handler,使我们用起来更加方便,不用去关注Handler。由于后台线程不能更新UI,而很多情况下,我们在后台线程做完一件事后,一般都会更新U...转载 2018-07-22 07:21:18 · 275 阅读 · 0 评论 -
线程中的wait() 与 锁的关系
我们先看一段代码:/** * 计算输出其他线程锁计算的数据* */ public class ThreadA { public static void main(String[] args) throws InterruptedException{ ThreadB b = new ThreadB(); //启动计算线程 b.st...转载 2018-08-23 06:39:16 · 447 阅读 · 0 评论 -
Java多线程(一)、多线程的基本概念和使用
一、进程和线程的基础知识1、进程和线程的概念进程:运行中的应用程序称为进程,拥有系统资源(cpu、内存)线程:进程中的一段代码,一个进程中可以有多段代码。本身不拥有资源(共享所在进程的资源)在java中,程序入口被自动创建为主线程,在主线程中可以创建多个子线程。区别: 1、是否占有资源问题 2、创建或撤销一个进程所需要的开销比创建或撤销一个线程所需要的开销大。 3、...转载 2018-08-16 06:38:07 · 127 阅读 · 0 评论 -
Java多线程(二)、线程的生命周期和状态控制
一、线程的生命周期线程状态转换图:1、新建状态用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)。注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadStateException异常。2、就绪状...转载 2018-08-16 06:38:14 · 2252 阅读 · 0 评论 -
Java多线程(三)、线程同步
在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系。可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题。现在就来学习多线程对数据访问的控制吧。 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。...转载 2018-08-16 06:38:21 · 108 阅读 · 0 评论 -
Java多线程(四)、线程池
系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互。在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。与数据库连接池类似的是,线程池在系统启动时即创建大量空闲的线程,程序将一个Runnable对象传给线程池,线程池就会启动一条线程来执行该对象的run方法,当run方法执行结束后,该线程并不会死亡,而是再次返回线程池中...转载 2018-08-16 06:38:28 · 133 阅读 · 0 评论 -
Java多线程(五)、多线程其他知识简要介绍
一、线程组 /** * A thread group represents a set of threads. In addition, a thread * group can also include other thread groups. The thread groups form * a tree in which every thre...转载 2018-08-16 06:38:35 · 104 阅读 · 0 评论 -
Java多线程(六)、ThreadLocal类
一、概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一...转载 2018-08-16 06:38:46 · 131 阅读 · 0 评论 -
Java多线程(七)、Volatile 关键字
Java 理论与实践: 正确使用 Volatile 变量简介: Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。在这期的Java 理论与实践 中,Brian Goetz 将介绍几种正确使用 volatile 变量的模式...转载 2018-08-16 06:38:53 · 93 阅读 · 0 评论 -
Java线程:新特征-有返回值的线程
在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写。或者干脆绕过这道坎,走别的路了。 现在Java终于有可返回值的任务(也可以叫做线程)了。 可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。 执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callab...转载 2018-07-28 06:24:48 · 189 阅读 · 0 评论 -
Java线程:新特征-锁(上)
在Java5中,专门提供了锁对象,利用锁可以方便的实现资源的封锁,用来控制对竞争资源并发访问的控制,这些内容主要集中在java.util.concurrent.locks 包下面,里面有三个重要的接口Condition、Lock、ReadWriteLock。 Condition Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截...转载 2018-07-28 06:24:55 · 107 阅读 · 0 评论 -
Java线程:新特征-锁(下)
在上文中提到了Lock接口以及对象,使用它,很优雅的控制了竞争资源的安全访问,但是这种锁不区分读写,称这种锁为普通锁。为了提高性能,Java提供了读写锁,在读的地方使用读锁,在写的地方使用写锁,灵活控制,在一定程度上提高了程序的执行效率。 Java中读写锁有个接口java.util.concurrent.locks.ReadWriteLock,也有具体的实现ReentrantReadWri...转载 2018-07-28 06:25:01 · 102 阅读 · 0 评论 -
Java线程:新特征-信号量
Java的信号量实际上是一个功能完毕的计数器,对控制一定资源的消费与回收有着很重要的意义,信号量常常用于多线程的代码中,并能监控有多少数目的线程等待获取资源,并且通过信号量可以得知可用资源的数目等等,这里总是在强调“数目”二字,但不能指出来有哪些在等待,哪些资源可用。 因此,本人认为,这个信号量类如果能返回数目,还能知道哪些对象在等待,哪些资源可使用,就非常完美了,仅仅拿到这些概括性的数字...转载 2018-07-29 09:00:19 · 89 阅读 · 0 评论 -
Java线程:新特征-阻塞队列
阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue,阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素的操作会被阻塞等待,直到有空位为止。同样,当队列为空时候,请求队列元素的操作同样会阻塞等待,直到有可用元素为止。 有了这样的功能,就为多线程的排队等候的模型实现开辟了便捷通道,非常有用。 ...转载 2018-07-29 09:00:37 · 102 阅读 · 0 评论 -
Java线程:新特征-阻塞栈
对于阻塞栈,与阻塞队列相似。不同点在于栈是“后入先出”的结构,每次操作的是栈顶,而队列是“先进先出”的结构,每次操作的是队列头。 这里要特别说明一点的是,阻塞栈是Java6的新特征。、 Java为阻塞栈定义了接口:java.util.concurrent.BlockingDeque,其实现类也比较多,具体可以查看JavaAPI文档。 下面看一个简单例子: impor...转载 2018-07-29 09:00:44 · 123 阅读 · 0 评论 -
Java线程:新特征-条件变量
条件变量是Java5线程中很重要的一个概念,顾名思义,条件变量就是表示条件的一种变量。但是必须说明,这里的条件是没有实际含义的,仅仅是个标记而已,并且条件的含义往往通过代码来赋予其含义。 这里的条件和普通意义上的条件表达式有着天壤之别。 条件变量都实现了java.util.concurrent.locks.Condition接口,条件变量的实例化是通过一个Lock对象上调用newC...转载 2018-07-29 09:00:50 · 399 阅读 · 0 评论 -
Java线程:新特征-原子量
所谓的原子量即操作变量的操作是“原子的”,该操作不可再分,因此是线程安全的。 为何要使用原子变量呢,原因是多个线程对单个变量操作也会引起一些问题。在Java5之前,可以通过volatile、synchronized关键字来解决并发访问的安全问题,但这样太麻烦。Java5之后,专门提供了用来进行单变量多线程并发安全访问的工具包java.util.concurrent.atomic,其中的...转载 2018-07-29 09:01:04 · 157 阅读 · 0 评论 -
Java线程:新特征-障碍器
Java5中,添加了障碍器类,为了适应一种新的设计需求,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择障碍器了。 障碍器是多线程并发控制的一种手段,用法很简单。下面给个例子: import java.util.concurrent.BrokenBarrierException; import java.util....转载 2018-07-29 09:01:11 · 113 阅读 · 0 评论 -
Java线程:概念与原理
一、操作系统中线程和进程的概念现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中...转载 2018-07-27 06:15:47 · 101 阅读 · 0 评论