性能优化之_android多线程
本文大纲为:
如何创建线程
线程间如何通讯
线程间如何安全的共享信息
一、线程的创建
Thread在run方法中执行具体事务,或者传入一个runnable对象,但是不能调用view控件的更新方法,但是可以调用view控件的post方法
- Thread thread1 = new Thread("Thread1"){
- public void run() {
- //do something
- }
- };
- thread1.start();
- Thread thread2 = new Thread(new Runnable() {
- @Override
- public void run() {
- mText.setText("hello world");// crash !!
- }
- });
- Thread thread3 = new Thread(new Runnable() {
- @Override
- public void run() {
- mText.post(new Runnable() {
- @Override
- public void run() {
- mText.setText("hello world");// working !
- }
- });
- }
- });
通过Thread的setPriority来设置线程的有限期,高优先级的线程会更快的执行,但是会影响到别的线程
二、线程间通讯
一般来说可以使用AsyncTask和handler/looper的机制来实现
AsyncTask适合短时间异步执行的操作,复写下列方法
doInbackground()//另一个线程中执行
onPreExecute()
onProgressUpdate(Progress... values)
onPostExecute(Result result)
onCancelled()
AsyncTask中的任务是串行执行的,后面的任务要等前面的任务执行完毕才能开始执行。若需要改变这个机制,可以尝试使用executeOnExecutor方法
Hanlder机制是Android中处理消息的经典机制。Handler类似于一个事件处理器同时也负责放置物体(message),MessageQueue是个传送带,Looper是使得传送带运转的动力,message即需要等待处理的货物
可以另起一个带有Hanlder/Looper的Thread用来处理任务并且和主线程通讯,可以使用HanlderThread来创建避免出现一些异步任务导致的问题
- ublic class MyHandlerThread extends HandlerThread{
- private Handler handler;
- public MyHandlerThread(String name) {
- super(name);
- // TODO Auto-generated constructor stub
- }
- public Handler getHandler(){
- return handler;
- }
- @Override
- public synchronized void start() {
- super.start();
- Looper looper = getLooper();
- handler = new Handler(looper){
- @Override
- public void handleMessage(Message msg) {
- switch(msg.what)
- {
- //do something
- }
- }
- };
- }
- }
主线程可以这样子调用这个HandlerThead,以用来在子线程中执行一些操作,当然在HandlerThead的start方法中也可以执行主线程的Handler用来将结果返回
- MyHandlerThread subThread = new MyHandlerThread("sub-thread");
- private void dothings(){
- subThread.getHandler().sendMessage(msg);
- }
三、线程间安全共享对象
由于java内存模型的特殊,两个线程对同一个变量操作的时候,由于先是从内存中读取数据到寄存器,然后再将结果写回到内存中,若在thread1写回数据到内存前,另一个thread2已经写回过了数据,那么thread1再次写数据的话,这个时候结果对于thread2来说就是不对了
所以就需要synchronized来同步 ,可以对方法或者代码块加锁,但是在synchronized中最好不要调用另一个同步代码块,否则可能会因为互相等待而导致死锁
同步也可以用volatile来修饰变量实现
- private static volatile int mValue = 0;
- private void setValue(int n){
- mValue = n;
- }
- public static void loop(){
- while(mValue != 100){
- try{
- Thread.sleep(1000);
- }catch(Exception e){
- }
- }
- }
这样子表示每次读取mValue这个值的时候都要等待读取最终的值
在Activity中使用AsyncTask会出现一个问题,如果task正在执行,而这个时候屏幕旋转了,导致Activity重建。那么这个时候task里面的context的对象都是过时得了,会造成各种问题。
解决方法就是在onSaveInstance或者onRetainNonConfiguration中返回这个task的handle,在Activty的onCreate中重新进行判断。
参考资料
带有Handler的子线程执行操作:
http://www.cnblogs.com/allin/archive/2010/05/19/1738800.html
线程池
http://www.cnblogs.com/yezhenhan/archive/2012/01/07/2315645.html
Activity和AsyncTask
http://blog.csdn.net/java2009cgh/article/details/7008983
性能优化之_android多线程的更多相关文章
- 【Bugly干货】Android性能优化典范之多线程篇
本文涉及的内容有:多线程并发的性能问题,介绍了 AsyncTask,HandlerThread,IntentService 与 ThreadPool 分别适合的使用场景以及各自的使用注意事项,这是一篇 ...
- 性能优化之_android内存
优化内存使用主要是三个原则: CPU如何操纵特定的数据类型 数据和指令需要占用多少存储空间 数据在内存中的布局方式 处理大量数据时,使用可以满足要求的最小字节数据类型,能用short就不用int,能用 ...
- 性能优化之_android布局优化
优化布局的的原则就是减少创建的对象的数量,setContentView话费onCreate到onResume中的大概99%的时间1.使用Relativelayout而不是LinearLayout,Li ...
- sqlite3 多线程和锁 ,优化插入速度及性能优化
一. 是否支持多线程? SQLite官网上的"Is SQLite threadsafe?"这个问答. 简单来说,从3.3.1版本开始,它就是线程安全的了.而iOS的SQLite ...
- Java多线程性能优化
大家使用多线程无非是为了提高性能,但如果多线程使用不当,不但性能提升不明显,而且会使得资源消耗更大.下面列举一下可能会造成多线程性能问题的点: 死锁 过多串行化 过多锁竞争 切换上下文 内存同步 下面 ...
- Synchronized锁性能优化偏向锁轻量级锁升级 多线程中篇(五)
不止一次的提到过,synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的 尽管最初synchronized的性能效率比较差,但是随着版本的升级,synchro ...
- 探索并发编程(六)------Java多线程性能优化
大家使用多线程无非是为了提高性能,但如果多线程使用不当,不但性能提升不明显,而且会使得资源消耗更大.下面列举一下可能会造成多线程性能问题的点: 死锁 过多串行化 过多锁竞争 切换上下文 内存同步 下面 ...
- 03.SQLServer性能优化之---存储优化系列
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概 述:http://www.cnblogs.com/dunitian/p/60413 ...
- C++ 应用程序性能优化
C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方 ...
随机推荐
- bzoj 4806 炮
Written with StackEdit. Description 众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子". 炮跟炮 ...
- Git克隆、修改、更新项目,及查看项目地址命令
第一步:在本地新建一个文件夹,作为本地仓库,如“texzt”,直接打开该文件夹,并单击右键,选择git bash here 则可以直接进入到该文件夹目录下. 第二步:将本地仓库初始化,命令:git i ...
- gatsbyjs 了解
1. 模型 2. 总结&&资料 从模型上可以看出和jamstack 提出的架构模型比较相似,可以看成是一个具体的实现,功能还是比较强大的 https://www.gatsbyjs.o ...
- Angular2配置文件详解
初学接触Angular2的时候,通过ng new your-project-name 命令生成一个工程空壳,本文来介绍下每个文件的作用及含义. 先来看看src的文件目录: 文件详解 File 文件 P ...
- Tomcat && Servlet(1)
一.概述 为了让web服务器和web应用程序进行访问交互,servlet是这个交互的标准接口,web服务器必须符合servlet标准,web应用应该实现servlet接口. tomcat是一个符合se ...
- ansible命令应用示例
ansible命令应用示例 ping slave组 ansible slave -m ...
- VMware网络模式介绍
VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式). Bridged 模式: 在桥接模式下,VMware虚拟机里的系统就像是 ...
- optimize table tablename
optimize 优化表OPTIMIZE 命令支持的引擎MyIsam, InnoDB, ARCHVE当对表有大量的增删改操作时,需要用optimize对表进行优化,可以减少空间与提高I/O性能,命令o ...
- iSCSI存储的3种连接方式
我们分析了iSCSI存储的系统结构,下面来看iSCSI是如何与服务器.工作站等主机设备来连接的,也就是我们如何建立一个iSCSI网络存储系统. iSCSI设备的主机接口一般默认都是IP接口,可以直接与 ...
- 【转】JMeter 聚合报告之90% Line参数说明
其实要说明这个参数的含义非常简单,可能你早就知道他的含义,但我对这个参数一直有误解,而且还一直以为是“真理”,原于一次面试,被问到了这个问题,所以引起我这个参数的重新认识. 先说说我错误的认识: 我一 ...