本文大纲为:

如何创建线程

线程间如何通讯

线程间如何安全的共享信息

一、线程的创建

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多线程的更多相关文章

  1. 【Bugly干货】Android性能优化典范之多线程篇

    本文涉及的内容有:多线程并发的性能问题,介绍了 AsyncTask,HandlerThread,IntentService 与 ThreadPool 分别适合的使用场景以及各自的使用注意事项,这是一篇 ...

  2. 性能优化之_android内存

    优化内存使用主要是三个原则: CPU如何操纵特定的数据类型 数据和指令需要占用多少存储空间 数据在内存中的布局方式 处理大量数据时,使用可以满足要求的最小字节数据类型,能用short就不用int,能用 ...

  3. 性能优化之_android布局优化

    优化布局的的原则就是减少创建的对象的数量,setContentView话费onCreate到onResume中的大概99%的时间1.使用Relativelayout而不是LinearLayout,Li ...

  4. sqlite3 多线程和锁 ,优化插入速度及性能优化

    一. 是否支持多线程?   SQLite官网上的"Is SQLite threadsafe?"这个问答. 简单来说,从3.3.1版本开始,它就是线程安全的了.而iOS的SQLite ...

  5. Java多线程性能优化

    大家使用多线程无非是为了提高性能,但如果多线程使用不当,不但性能提升不明显,而且会使得资源消耗更大.下面列举一下可能会造成多线程性能问题的点: 死锁 过多串行化 过多锁竞争 切换上下文 内存同步 下面 ...

  6. Synchronized锁性能优化偏向锁轻量级锁升级 多线程中篇(五)

    不止一次的提到过,synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的 尽管最初synchronized的性能效率比较差,但是随着版本的升级,synchro ...

  7. 探索并发编程(六)------Java多线程性能优化

    大家使用多线程无非是为了提高性能,但如果多线程使用不当,不但性能提升不明显,而且会使得资源消耗更大.下面列举一下可能会造成多线程性能问题的点: 死锁 过多串行化 过多锁竞争 切换上下文 内存同步 下面 ...

  8. 03.SQLServer性能优化之---存储优化系列

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概  述:http://www.cnblogs.com/dunitian/p/60413 ...

  9. C++ 应用程序性能优化

    C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方 ...

随机推荐

  1. sql_自连接,181,182,196,197

    181. Employees Earning More Than Their Managers https://leetcode.com/problems/employees-earning-more ...

  2. ArcGIS Runtime SDK for WPF之SimpleRenderer无法添加、报错“图形符号无法序列化为 JSON”

    ArcGIS Runtime SDK for WPF之SimpleRenderer无法添加.报错“图形符号无法序列化为 JSON” 在上一篇博文中如果在 esri:Map 里面是否设置了的UseAcc ...

  3. CSS3的圆角border-radius属性

    一,语法解释 border-radius : none | <length>{1,4} [/ <length>{1,4} ] <length>: 由浮点数字和单位标 ...

  4. LINUX 11G RAC ASM磁盘组在线增加磁盘扩容

    LINUX 11G RAC ASM磁盘组在线增加磁盘扩容 1.操作系统版本 OEL 6.1 [root@cqltjcpt1 ~]# more /etc/redhat-release Red Hat E ...

  5. 通过ssh连接git操作

    项目又一次从svn切换到git,而且要求使用安全协议ssh连接git.不管是个人还是组织,git上只负责导入公钥,而不会帮你生成.这里先说下怎么生成这个ssh的私钥和公钥. 首先你得找到有ssh命令的 ...

  6. JAX-RS之queryparam、PathParam、DefaultValue、FormParam、Context、RestController等

    这几天做东西接触了JAX-RS的东西,没有系统的从开始就学,只是单纯去复制粘贴的用,主要用到了几个Annotations变量,具体如下: queryparam.PathParam.FormParam. ...

  7. Java基础知识复习(二)

    Java 重写(Override)与重载(Overload) 重写 是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变,属于编译时多态.即外壳不变,核心重写! 重写的好处在于子 ...

  8. Pycharm安装工具包

    1.在settings->Project Interpreter->configure interpreters->Install中可以找到所有的模块. PyCharm IDE会帮助 ...

  9. thinkphp5 设置.htaccess报input file specified的解决方法

    先去检查服务器设置,这个网上方法很多就不说了,如果服务器没问题还是报这个错误的话可能和php版本有关 php5.4和以下版本的.htaccess <IfModule mod_rewrite.c& ...

  10. [三卷天书]记一个asp.net生成两个日期范围内生成随机时间的方法

    想网上找个生成随机天数的方法找不到,后面只得自己写了,贴给大家方便使用 思路:算两个日期的相差天数,然后在0到相差天数的范围内生成随机数,再用结束时间的天数部分减去这个随机数,代码: /// < ...