Android多线程基础知识

1、进程

进程是系统调度和资源分配的一个独立单位。android

在Android中,一个应用程序就是一个独立的集成,应用运行在一个独立的环境中,能够避免其余应用程序/进程的干扰。当咱们启动一个应用程序时,系统就会建立一个进程(该进程是从Zygote中fork出来的,有独立的ID),接着为这个进程建立一个主线程,而后就能够运行MainActivity了,应用程序的组件默认都是运行在其进程中。开发者能够经过设置应用的组件的运行进程,在清单文件中给组件设置:android:process = "进程名";能够达到让组件运行在不一样进程中的目的。让组件运行在不一样的进程中,既有好处,也有坏处。咱们依次的说明下。安全

好处:每个应用程序(也就是每个进程)都会有一个内存预算,全部运行在这个进程中的程序使用的总内存不能超过这个值,让组件运行不一样的进程中,可让主进程能够拥有更多的空间资源。当咱们的应用程序比较大,须要的内存资源比较多时(也就是用户会抱怨应用常常出现OutOfMemory时),能够考虑使用多进程。bash

坏处:每一个进程都会有本身的虚拟机实例,所以让在进程间共享一些数据变得相对困难,须要采用进程间的通讯来实现数据的共享。网络

2、线程

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。多线程

在Android中,线程会有那么几种状态:建立、就绪、运行、阻塞、结束。当应用程序有组件在运行时,UI线程是处于运行状态的。默认状况下,应用的全部组件的操做都是在UI线程里完成的,包括响应用户的操做(触摸,点击等),组件生命周期方法的调用,UI的更新等。所以若是UI线程处理阻塞状态时(在线程里作一些耗时的操做,如网络链接等),就会不能响应各类操做,若是阻塞时间达到5秒,就会让程序处于ANR(application not response)状态。并发

1.线程做用

减小程序在并发执行时所付出的时空开销,提升操做系统的并发性能。app

2.线程分类

守护线程、非守护线程(用户线程)异步

2.1 守护线程

定义:守护用户线程的线程,即在程序运行时为其余线程提供一种通用服务post

常见:如垃圾回收线程性能

设置方式:thread.setDaemon(true);//设置该线程为守护线程

2.2 非守护线程(用户线程)

主线程 & 子线程。

2.2.1 主线程(UI线程)

定义:Android系统在程序启动时会自动启动一条主线程

做用:处理四大组件与用户进行交互的事情(如UI、界面交互相关)

由于用户随时会与界面发生交互,所以主线程任什么时候候都必须保持很高的响应速度,因此主线程不容许进行耗时操做,不然会出现ANR。

2.2.2 子线程(工做线程)

定义:手动建立的线程

做用:耗时的操做(网络请求、I/O操做等)

2.3 守护线程与非守护线程的区别和联系

区别:虚拟机是否已退出,即

a. 当全部用户线程结束时,由于没有守护的必要,因此守护线程也会终止,虚拟机也一样退出

b. 反过来,只要任何用户线程还在运行,守护线程就不会终止,虚拟机就不会退出

3.线程优先级

3.1 表示

线程优先级分为10个级别,分别用Thread类常量表示。

Thread.MIN_PRIORITY //优先级1
Thread.MAX_PRIORITY //优先级10
复制代码
3.2 设置

经过方法setPriority(int grade)进行优先级设置,默认线程优先级是5,即 Thread.NORM_PRIORITY。

4.线程状态

建立状态:当用 new 操做符建立一个线程的时候

就绪状态:调用 start 方法,处于就绪状态的线程并不必定立刻就会执行 run 方法,还须要等待CPU的调度

运行状态:CPU 开始调度线程,并开始执行 run 方法

阻塞(挂起)状态:线程的执行过程当中因为一些缘由进入阻塞状态,好比:调用 sleep/wait 方法、尝试去获得一个锁等

结束(消亡)状态:run 方法执行完 或者 执行过程当中遇到了一个异常

(1)start()和run()的区别

经过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并无运行。调用Thread类调用run()方法来完成其运行操做的,方法run()称为线程体,它包含了要执行的这个线程的内容,run()运行结束,此线程终止,而后CPU再调度其它线程。

(2)sleep()、wait()、yield()的区别

sleep()方法属于Thread类,wait()方法属于Object类。

调用sleep()方法,线程不会释放对象锁,只是暂停执行指定的时间,会自动恢复运行状态;调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池,不调用notify()方法,线程永远处于就绪(挂起)状态。

yield()直接由运行状态跳回就绪状态,表示退让线程,让出CPU,让CPU调度器从新调度。礼让可能成功,也可能不成功,也就是说,回到调度器和其余线程进行公平竞争。

3、进程和线程的区别

  1. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位; 进程是系统调度和资源分配的一个独立单位;

  2. 线程不拥有系统资源; 进程能够申请和拥有系统资源;

  3. 线程间资源共享; 进程间经过IPC实现资源共享;

4、多线程

1.Android线程的原则

  • 不能再主线程中作耗时操做

  • 不能再非UI线程中更新UI

(1)为何不能再主线程中作耗时操做

防止ANR, 不能在UI主线程中作耗时的操做,所以咱们能够把耗时的操做放在另外一个工做线程中去作。操做完成后,再通知UI主线程作出相应的响应。这就须要掌握线程间通讯的方式了。 在Android中提供了两种线程间的通讯方式:一种是AsyncTask机制,另外一种是Handler机制。

(2)为何不能在非UI线程中更新UI 由于Android的UI线程是非线程安全的,应用更新UI,是调用invalidate()方法来实现界面的重绘,而invalidate()方法是非线程安全的,也就是说当咱们在非UI线程来更新UI时,可能会有其余的线程或UI线程也在更新UI,这就会致使界面更新的不一样步。所以咱们不能在非UI主线程中作更新UI的操做。

2.Android实现多线程的几种方式

(1)implements Runnable
(2)extends Thread
(3)handler机制
    handler.sendMessage()
    handler.post(Runnable action)
         view.post(Runnable action) //实质也是handler.post
         activity.runOnUiThread(Runnable action)  //实质也是handler.post
(4)AsyncTask
(5)HandlerThread
(6)IntentService
(7)ThreadPool
复制代码

3.为什么须要多线程

多线程的本质就是异步处理,直观一点说就是不要让用户感受到“很卡”。

4.多线程机制的核心是啥

多线程核心机制是Handler

相关文章
相关标签/搜索