Android进程和线程详解

您所在的位置:网站首页 四核八线程的优缺点 Android进程和线程详解

Android进程和线程详解

#Android进程和线程详解| 来源: 网络整理| 查看: 265

一、前期基础知识普及

(1)苹果6双核手机跟其它4核和8核手机有什么区别?千万不要把苹果手机的硬件直接和安卓之类的手机相比较,根本没有可比性,苹果最新的6和6Plus都只是双核处理器,1GB运行内存 800万像素摄像头,但是苹果手机的强大之处是强大的系统优化、丰富的应用软件、高人一等的相机算法,使得它仍然是地球上使用体验最好的手机(没有之一,虽然我不是果粉,但我仍然不得不这么说)。(2)安卓手机双核、四核、八核是什么意思?打个比喻吧 汽车的动力,单缸  双缸 四缸的发动机 肯定是四缸的发动机动力更强劲,手机的内核说的是CPU芯片的核心数量,比如大家都是1G的频率,双核的就有2个核心1G*2=2G,这样它的运算速度和处理任务程序速度就更快,核心数量越多越高它的处理能力运算速度就越快。我们来看看INTEL的CPU G2020和E3-1230这两款CPU的参数对比一下,G2020的核心数:2个,线程数:2个。我们在来看看E3-1230,核心数:4个,线程数:8个。那么,4核的CPU和双核的CPU在外观上看上去没什么区别,那么我们怎么去区分CPU是6核的还是4核还是双核的,线程数又是什么呢,线程数技术是在一颗CPU同时执行多个程序而共同分享一颗CPU内的资源,现在又双核双线程的CPU,有4核4线程CPU,有双核4线程CPU,有4核8线程的CPU,值得注意一下,很多不良商贩,经常糊弄消费者,把双核4线程的CPU当4核CPU卖,这个时候,大家一定要注意。

二、Android进程和线程相关的分析

当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。(一个Android应用就是一个Linux进程,每个应用在各自的进程中运行,互不干扰,比较安全。一个应用对应一个主线线程,就是通常所说的UI线程,android遵守的就是单线程模型,所以说UI操作不是线程安全的并且这些操作必须在UI线程中执行。)

进程,常被定义为程序的执行,可以把一个进程看成一个独立的程序,在内存中有其完备的数据空间和代码空间。一个进程所拥有的数据和变量只属于他自己。

线程,某一进程中一路单独运行的程序。也就是线程存在于进程之中,一个进程由一个或多个线程构成,各线程共享相同的代码和全局数据,但各有自己的堆栈。由于堆栈是每个线程一个,因此局部变量对每一线程来说是私有的。由于所有线程共享同样的代码和全局数据,他们比进程更紧密,线程间的相互作用更容易,因为他们本身有某些供通信用的共享内存:进程的全局数据  一个进程和一个线程最显著的区别是:线程有自己的全局数据。线程存在于进程中,因此一个进程的全局变量由所有的线程共享。由于线程共享同样的系统区域,操作系统分配给一个进程的资源对该进程的所有线程都是可用的,正如全局数据可供所有线程使用一样。

APP实例:手机上打开百度网盘APP——开始了属于百度网盘APP的进程;下载一份《阿里巴巴Android开发手册》——开始了子任务,出现了第一个线程;在下载文件的同时,上传一份最新的Android控件属性的Excel文件——开始了第二个子任务,出现了第二个线程。在这一过程中,出现了一个进程和两个线程,两个线程系统分配不同的处理器完成,这就是异步实现的方式。

引入线程的好处(1)易于调度。(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。(3)开销少。创建线程比创建进程要快,所需开销很少。。(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。进程和线程的关系 (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。(3)处理机分给线程,即真正在处理机上运行的是线程。

(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步

单线程模型:当一个程序第一次启动时,Android会同时启动一个对应的主线程(MainThread),主线程主要负责处理与UI相关的事件,如用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处 理。所以主线程通常又被叫做UI线程。在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。

—————————————————————我是分隔线——————————————————

三、进程优先级分类

先记住一句口诀—“前台可见进程服务于后台空进程”——既描述了线程的种类,也描述了线程的优先级:前台进程>可见进程>服务进程>后台进程>空进程。下面我们来具体分析一下,各个线程的具体情况:

①前台进程 —— Foreground process

用户当前操作所必需的进程。通常在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。

1)拥有用户正在交互的 Activity(已调用 onResume())

2)拥有某个 Service,后者绑定到用户正在交互的 Activity

3)拥有正在“前台”运行的 Service(服务已调用 startForeground())

4)拥有正执行一个生命周期回调的 Service(onCreate()、onStart() 或 onDestroy())

5)拥有正执行其 onReceive() 方法的 BroadcastReceiver

②可见进程 —— Visible process

没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。

1)拥有不在前台、但仍对用户可见的 Activity(已调用 onPause())

2)拥有绑定到可见(或前台)Activity 的 Service

③服务进程 —— Service process

尽管服务进程与用户所见内容没有直接关联,但是它们通常在执行一些用户关心的操作(例如,在后台播放音乐或从网络下载数据)。因此,除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。

1)正在运行 startService() 方法启动的服务,且不属于上述两个更高类别进程的进程。

④后台进程 —— Background process

后台进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。 通常会有很多后台进程在运行,因此它们会保存在 LRU 列表中,以确保包含用户最近查看的 Activity 的进程最后一个被终止。如果某个 Activity 正确实现了生命周期方法,并保存了其当前状态,则终止其进程不会对用户体验产生明显影响,因为当用户导航回该 Activity 时,Activity 会恢复其所有可见状态。

1)对用户不可见的 Activity 的进程(已调用 Activity的onStop() 方法)

⑤空进程 —— Empty process

保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。 为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。

1)不含任何活动应用组件的进程

—————————————————————我是分隔线——————————————————

四、线程切换,具体代码实现

Android中使用多线程最常用的方法是:

①实现Runnable接口,覆写run()方法;

继承Thread类的方法本质上也是实现了Runnable接口的一个实例。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。

②继承Thread类,覆写run()方法(实际也是实现Runnable接口)。 如果自己的类已经extends另一个类,就无法直接extends Thread,此时必须实现一个Runnable接口。同时为了启动My Thread,需要首先实例化一个Thread,并传入自己的已经实现好Runnable接口的目标对象。

public class RunabbleImp implements Runnable {

    @Override

        public void run() {

        doSomeThing();

}

        private void doSomeThing() {

        System.out.println(Thread.currentThread().getName()+" is running!");

    }

}

—————————————————-----我是分隔线----———————————————————

public void onClick(View v) {

  new Thread(new Runnable() {

    public void run() {

      Bitmap b = loadImageFromNetwork("http://example.com/image.png");

    }

  }).start();

}

最终在实际开发中,出于性能、安全、管理的思考,在Android中引入线程。注意:在实际开发中,注意把网络相关线程,向数据库请求数据线程,通过开启支线程的方式实现。这些需要响应时间的操作,不要放在UI线程中,也即主线程(UI线程只做和界面相关的内容)中实现,避免出现ANR错误(应用无响应,系统弹出关闭应用提示框),会导致用户关闭应用甚至卸载应用。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3