• Androidi性能优化之多线程和同步


    线程:

      创建线程的方法:

      a:定义Thread类的实例,并start();

      b:实现Runnable接口,并作为参数传给Thread类的实例,然后start();

    不管线程是通过什么方式创建的,它都有一个优先级,调度器根据优先级来决定调度执行哪个线程,即让哪个线程使用CPU,调用Thread.setPriority()可以改变线程的优先级。thread.setPriority(Thread.MAX_PRIORITY); //最高优先级(比UI线程高)

      如果未指定优先级,会使用默认值,Thread类定义了三个变量:

      a:MIN_PRIORITY(1)

      b:NORM_PRIORITY(5) -----默认优先级

      C:MAX_PRIORITY(10)

      如果应用设置的线程优先级超出取值范围,也就是说,小于1或大于10,那么会抛出Illegal ArgumentException异常

    另一中设置线程优先级的方式是基于Linux优先级,主要参考的是android.os包里的Process.setThreadPriority API。

    注意:应该避免混用Thread.setPriority和Process.setThreadPriority,这会使代码一团糟。注意,Linux的优先级从-20(最高)到19(最低),而线程的优先级从1(最低)到10(最高)。

    在Android中创建线程并在后台执行非常简单,但更新用户界面比较麻烦:因为view的方法只能在UI线程中调用,所以必须把结果反馈给主线程处理。

    AsyncTask:

      很多情况下,应用处理顺序如下:

      a:在UI线程收到事件

      b:在非UI线程中处理相应事件

      c:UI根据处理结果进行刷新

    为了简化这个模式,Android 1.5及以上版本定义了AsyncTask类,AsyncTask类可以让应用执行后台操作,并通知UI线程操作结果。为简单起见,对用户隐藏了Thread、Runable以及其他相关对象。

      实际上,doInBackground()调用时机取决于Android版本,Android 1.6之前,任务是串行执行,只需要一个后来线程。从Android 1.6开始,线程池取代了单个的后台线程,线程池允许并行执行多个任务,以提升性能。然而,并行执行多个任务,如果没有正确的同步或者任务执行顺序不符合开发者的预期,那很可能导致严重的问题。因此,Android团队计划在Honeycomb之后恢复到默认情况下只有一个后台线程的模式。

    Handler和 Looper

      多线程应用程序通信的基石:Handler 、Looper

    数据类型:

      我们知道两种产生线程的方法,使用Thread和AsyncTask类,如果两个或多个线程访问相同的数据,就需要确保数据类型支持并发访问。

    同步(Synchronized)、易变(volatile)、内存模型

      如果想在多个线程之间共享对象,但没有实现任何细粒度的锁机制,可以用Synchronized关键字确保数据访问的线性安全。

     Java的内存模型:一个线程中变量的修改可能不会立即对其他线程可见。事实上,也许永远不可见。

  • 相关阅读:
    Linux命令大全
    Restframework 视图组件与序列号组件的应用.
    Linux常用命令
    数据结构
    MongoDB
    算法
    Flask 语音分析
    Flask Session ,pymysql ,wtforms组件 虚拟virtualenv venv
    Flask 视图,模板,蓝图.
    Flask初识
  • 原文地址:https://www.cnblogs.com/0616--ataozhijia/p/3649519.html
Copyright © 2020-2023  润新知