Android 进程、线程

一、线程应用基础

概述:线程是CPU独立运行和独立调度的基本单位(可以理解为一个进程中执行的代码片段),进程是资源分配的基本单位(进程是一块包含了某些资源的内存区域,通俗说,就是运行中的程序)。进程是线程的容器,真正完成代码执行的是线程,而进程则作为线程的执行环境。一个程序至少包含一个进程,一个进程至少包含一个线程,一个进程中的多个线程共享当前进程所拥有的资源!!!

1.线程是什么?

线程是进程中的一个顺序的执行流,是进程中的一个最小的执行单位,所有进程内部的线程共享进程内存,进程间内存相互独立。

2.进程是什么?

进程是操作系统中正在运行的一个程序,一个多任务操作系统可以并发的执行多个进程,而进程的并发严格来讲是进程中线程的并发。


3.并发是什么?(一个cpu下的线程)

1)广义的并发:同时

2)狭义的并发:交替


4.多线程应用场景?

1)多个并发下载任务

2)播放音乐的同时还可以对其进行缓存(就是下载)

3)。。。。


5.Android 中线程类型及创建启动?

1)线程类型:Thread

2)线程创建

a)构建Thread类的子类对象然后重写run方法

b)构建Thread类对象的同时传入Runnable类型的对象

3)线程启动:start方法(可以让线程处于就绪状态)

4)线程运行:线程启动以后一旦获得cpu就会执行run方法

6)相关状态:

a)新建状态(新创建的线程,还没启动)

b)就绪状态(启动了线程或休眠的线程醒了)

c)运行状态

d)阻塞状态(线程休眠或Io)

f)死亡状态(线程run方法结束)

7)相关方法(一部分):点击打开链接


二、Android 线程应用同步

1.多线程同步概述

线程同步是多线程在共享数据集上的互斥与协作。

互斥:多线程在共享数据集上排队执行。

协作:多线程在共享数据集上协作执行。


2.多线程互斥的实现

场景:

1)多个线程

2)共享数据集

3)共享数据集上的操作为非原子操作

实现过程:

1)同步方法

a)public synchronized void put(){}

b ) public static synchronized void put(){}

说明:(1)实例方法默认使用this作为对象锁

    (2)静态方法默认使用类对象作为对象锁

2)同步代码块:synchronized ("Lock"){}

回顾:

1)StringBuffer是一个线程不安全的StringBuilder

2)ArrayList是一个线程不安全的List

3)HashMap是一个线程不安全的集合

。。。。

说明:在线程不安全的环境使用集合时要考虑线程安全集合的应用,例如:

1.Collections.synchronizedList(Llist)

2.COncurrentHashMap 线程安全并且高效(采用的是局部加锁)


三.android消息模型

1.Android 中消息模型概述?
1)是生产者消费者模型的一种实现
2)是Android特有线程工作机制的一种实现。
a)主线程(UI线程)执行UI操作
b)工作线程执行耗时操作


2.Android 中消息模型应用场景?
Android中一个进程内部的多个线程之间的通讯


3.Android 中消息模型应用API及功能?
1)Message
2)MessageQueue
3)Looper
4)Handler


4.Android 中消息模型应用实现?
1)工作线程发消息给主线程
2)主线程发消息给工作线程
3)主线程发消息给主线程




5.Android 中消息模型FAQ?
1)Android中每个线程最多有一个Looper
2)Android中每个线程最多有一个MessageQueue
3)Android中线程间消息的传递需要借助handler
4)Android中每个handler对象都必须关联一个Looper
5)Android中工作线程需要looper时可以借助HandlerThread对象创建
6)Android中activity退出时工作线程线程的Looper一定要退出。
7).................


6.Android 中线程内存泄漏现象

1)android中线程类型的声明是实例内部类,
或者实例方法中的局部内部类。
2)android中handler类型的声明是实例内部类,
或者实例方法中的局部内部类。
3)android中工作线程强引用activity中的view。
4)android中工作线程的looper在页面退出时
没有退出。


案例说明:
1)线程是实例内部或局部内部类

class MainActivity{


    public void onClick(View v){
     
       new WokerThread().start();
       new Thread(){//局部匿名内部类
            public void run(){}
       }.start();//此内部类会保存外部类引用


    }
    //实例内部类会保存外部类的引用
    //假如需要使用线程内部类建议使用static的
    class WorkerThread extends Thread{
        public void run(){
           //耗时操作
        }
    }
}




2)handler类型是实例内部类或局部内部类

class MainActivity{




    /**默认引用外部类对象*/
    class WokerHandler extends Handler{


        public void handleMessage(...){}
    }//建议这样的内部类使用static修饰


}//handler.sendMessage(msg);此时消息也会关联handler




3)工作线程强引用activity中的view


class MainActivity{


    public void onCreate(...){
      ...
      View view=findViewById(..);
    }
    class DownAsyncTask extends AsyncTask{
      private View v;
      public DownAsyncTask(View v){
         this.v=v;//强引用
      }
    }
}




4)工作线程的looper没有退出?


工作线程的looper不退出,线程就会一直
处于迭代状态。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值